【问题标题】:Data structure to hold and later combine sparse data保存和稍后组合稀疏数据的数据结构
【发布时间】:2017-08-03 18:49:20
【问题描述】:

需要有关构建以下数据结构的建议

M                  M
A1       A2        A3        A4       A5
a                  b                  c
a                  b          d        
a         e        b           
a         f        b

我的数据将如下所示。标记为M 的列一起构成唯一的行。现在我应该能够读取 csv 行并向上述数据结构添加一行。如果我再次遇到相同的唯一行,我需要以某种方式合并相同的唯一行,最后一个相同的唯一行将获胜并继承缺失值的值。

和上面的例子一样

我有多个相同的唯一行,因为所有标有M 的字段都是相同的。所以上表的最终表应该如下所示

M                  M
A1       A2        A3        A4       A5
a        f         b         d        c

我想知道是否有任何数据结构来保存这种结构?我不想重新发明新的?另外,如果我可以通过一些地图和列表组合来实现这一点。标头(A1、A2、A3)是动态的并且是未知的。我使用 csv 阅读器从 CSV 中读取了一行。

【问题讨论】:

    标签: java data-structures java-8


    【解决方案1】:

    您可以使用 HashMap,其中键是所有 M 列的串联。唯一的技巧是使用不能出现在任何 M 列中的连接分隔符,以避免一个或多个 M 列具有空值导致的问题。

    当您从 CSVReader 获取数据时,您会这样做:

    HashMap<String, ArrayList<String>> hm = new HashMap<String,ArrayList<String>>();
    while (csvreader.hasNext()) {
       String line = csvreader.lineReader().readLine();
       String[] fields = csvreader.parser.parseLine(line);
       String key = fields[0] + ":" + fields[2];
       ArrayList<String> exists = hm.get(key);
       if (exists == null)
          hm.put(key, new ArrayList<String>(Arrays.asList(fields)));
       else
          for (int i=0; i<fields.length; i++) // works only if lines are homogeneous
              if (fields[i] != null && fields[i].length() > 0)
                 exists.set(i, fields[i]);  // set values only if they're not null
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多