将TreeMap中的列值映射为键,行号作为值

时间:2013-11-14 19:21:05

标签: java collections treemap

我想从java中的文件中读取一列数字。例如:

945
922
922
480
480
819
819
289
386

我希望将这些数字放在TreeMap作为键。每个键的值将是其行数。因此,地图将具有以下内容:

{(945:1),(922:2,3),(480:4,5)}

我正在尝试上述内容,但是我收到了错误。

ArrayList<Integer> clusterNums = new ArrayList<>();
String clusterLine;
TreeMap<Integer, ArrayList<Integer[]>> clusterMap = new TreeMap<Integer, ArrayList<Integer[]>>();
while ((clusterLine = clusterFile.readLine()) != null) {
                clusterNums.add(Integer.parseInt(clusterLine));
             }
for (int i = 1; i < clusterNums.size(); i++){
      if (!clusterMap.containsKey(clusterNums.get(i-1))) {
           clusterMap.put(clusterNums.get(i-1), new ArrayList<Integer[]>());
         }
      clusterMap.get(clusterNums.get(i-1)).add(i);
 }

你可以告诉我吗?

感谢。

3 个答案:

答案 0 :(得分:2)

请勿使用ArrayList<Integer[]>,因为ArrayList本身就是容纳您的一维line numbers的容器,而是使用如下所示:

TreeMap<Integer, ArrayList<Integer>> clusterMap = new TreeMap<Integer, ArrayList<Integer>>();

ArrayList将包含文件中给定数字的行号。

假设当前号码为:num 因此,请检查clusterMap中的状态:

if(clusterMap.containsKey(num )){
     clusterMap.get(num).add(lineNumber);
}
else{
    ArrayList<Integer> list = new ArrayList<>();
    list.add(lineNumber);
    clusterMap.put(num, list);
}

答案 1 :(得分:1)

地图中的值应该是问题陈述中描述的一维数据结构。您正在使用ArrayList<Integer[]>这是一个数组列表,一个2D结构。

答案 2 :(得分:0)

您想映射到多个值?这称为MultiMap!

我建议:Guava TreeMultiMap

基本上你的值是与该键相关联的值的arraylist 所有你需要做的就是包含番石榴库,它将非常干净整洁,而不是试图创建你自己的多图实现。