将Java中的2D数组列表转换为哈希映射表

4

我有一个有关Java中将二维ArrayList转换为HashMap的小问题。在读取为二维ArrayList后,我的数据集看起来像这样:

0 1

0 2

1 2

1 3

第一列代表id,第二列代表物品。我想使用Java中的哈希映射创建频繁项目集,输出应如下:

1 0

2 0 1

3 1

我使用了这些代码,但是在使用过程中遇到了一些问题:

HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
for(Integer elem : data){
        map.put(elem[1], elem[0]);
}

我的数据是一个二维ArrayList。

错误信息显示:

incompatible types: ArrayList<Integer> cannot be converted to Integer
    for(Integer elem : data){
                       ^

任何帮助都将不胜感激!
2个回答

1
你可以这样做:

你想翻译的内容

List<List<Integer>> inputData = ...

Map<Integer, List<Integer>> dataAsMap = new HashMap<>();
for(List<Integer> row : data){
  Integer id = row.get(0);
  Integer item = row.get(1);
  List<Integer> rowInMap = dataAsMap.get(item);
  if (rowInMap == null) {
    rowInMap = new ArrayList<>(); 
    dataAsMap.put(item, rowInMap);
  }
  rowInMap.add(id);
}

一些注意事项:

  1. 你应该使用接口类型List、Map等作为类型(只有在创建新对象时才指定特定的实现类型,如HashMap!)
  2. 你的问题是:当在List of Lists上使用for-each(就像你所做的那样)...你不会得到单个的“单元格”,而是得到Lists [迭代列表的列表...每次迭代都会得到一个列表!]

因此,剩下的工作就是获取内部List的元素,并将它们推入Map中。需要注意的另一个部分是:你想创建一个Map的List对象。这些List对象也需要被创建!

(我没有通过编译器运行上面的代码,所以要小心打字错误,但总体上它应该告诉你需要知道的内容。如果你不知道代码在做什么,我建议添加println语句或在调试器中运行它)


非常感谢!我真的很感激! - BigD

0

这里有一种简单的方法:

  1. 使用 Map<Integer, List<Integer>>
  2. 迭代您的ArrayList。
  3. 查看地图中是否已经存在键。如果键已存在,则检索列表并将值添加到列表中,否则使用该值创建新列表。

程序:

class FooBar {
    public static void main (String[] args) throws Exception {
        int[][] data = {{0,1}, {0,2}, {1,2}, {1,3}};
        Map<Integer, List<Integer>> myMap = new HashMap<>();

        for(int i = 0; i < 4; i++) {
            List<Integer> values = myMap.containsKey(data[i][0]) ?
                                   myMap.get(data[i][0]) : new ArrayList<>();
            values.add(data[i][1]);
            myMap.put(data[i][0], values);
        }

        System.out.println(myMap);
    }
}

输出:

{0=[1, 2], 1=[2, 3]}

这只是为了说明基本方法。您可以根据需要进行修改。例如,您可以使用String而不是List<Integer>,并选择将值附加到String而不是添加到List

编辑:

这里有一个带有List<List<Integer>>作为输入的示例程序。在这里,我假设此列表的名称为input

程序:

class FooBar {
    public static void main (String[] args) throws Exception {
        /* Input Data */
        List<List<Integer>> input = new ArrayList<>();
        input.add(new ArrayList<Integer>(){{add(0); add(1);}});
        input.add(new ArrayList<Integer>(){{add(0); add(2);}});
        input.add(new ArrayList<Integer>(){{add(1); add(2);}});
        input.add(new ArrayList<Integer>(){{add(1); add(3);}});

        Map<Integer, List<Integer>> myMap = new HashMap<>();
        for(int i = 0; i < input.size(); i++) {
            List<Integer> values = myMap.containsKey(input.get(i).get(0)) ?
                                   myMap.get(input.get(i).get(0)) : new ArrayList<>();
            values.add(input.get(i).get(1));
            myMap.put(input.get(i).get(0), values);
        }

        System.out.println(myMap);
    }
}

输出:

{0=[1, 2], 1=[2, 3]}

非常感谢!但是如果输入数据是ArrayList呢? - BigD
如果它是一个 ArrayList,那么你将不得不迭代它而不是 int[][]。请查看修订后的答案。 - user2004685
@lixx3013 如果您认为这个答案解决了您的问题,请接受它。 - user2004685

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接