如何从两列txt文件中使用<Integer,List <Integer >>创建TreeMap

时间:2019-07-18 19:49:23

标签: java list dictionary

我正在读取一个具有两列的txt文件,其中每个元素都是一个整数。我想将第一列中的元素用作键,并将第二列中的元素用作我的值。

我只共享我数据集的一小部分。

0   1
0   2
0   3
0   4
1   2
1   3
1   0
Scanner scanner = new Scanner(new FileReader(DATADIR+"data.txt"));
TreeMap<Integer, List<Integer>> myMap = new TreeMap<Integer, List<Integer>>();
while (scanner.hasNextLine()) {
  String[] line= scanner.nextLine().split("\t");

}

现在,我需要的是一个结构,当我调用0时,该结构应该得到<1,2,3,4>。

3 个答案:

答案 0 :(得分:1)

您应该检查地图中是否存在该密钥,并进行相应添加。 示例代码:

messageout="The rain in Spain stays mainly in the plains"
summaryout="This is a test record"
alertnameout="Test Alert"


curl -v -silent request POST "URL.com?\
summary=`echo $summaryout | sed -e 's/ /%20/g'`&\
alertname=`echo $alertnameout | sed -e 's/ /%20/g'`&\
message=`echo $messageout | sed -e 's/ /%20/g'`"

答案 1 :(得分:1)

您可以尝试以下方法:

  TreeMap<Integer, List<Integer>> myMap = new TreeMap<Integer, List<Integer>>();
        while (scanner.hasNextLine()) {
            String[] line = scanner.nextLine().split("\\s+");               
            myMap.computeIfAbsent(Integer.valueOf(line[0]), k -> new ArrayList<>()).add(Integer.valueOf(line[1]));
        }
        System.out.println(myMap );

答案 2 :(得分:1)

我根本不会使用Scanner来读取文件。相反,请使用一种现代的流式传输文件内容的方法,然后根据需要处理每一行。

在我的环境中,用"\t"分割文件是行不通的,这就是为什么我在期望值之间用任意数量的空格分割了String的原因。

请参见以下最小示例:

public static void main(String[] args) {
    Path filePath = Paths.get(DATADIR).resolve(Paths.get("data.txt"));

    // define the map
    Map<Integer, List<Integer>> map = new TreeMap<>();

    try {
        // stream all the lines read from the file
        Files.lines(filePath).forEach(line -> {
            // split each line by an arbitrary amount of whitespaces
            String[] columnValues = line.split("\\s+");
            // parse the values to int
            int key = Integer.parseInt(columnValues[0]);
            int value = Integer.parseInt(columnValues[1]);
            // and put them into the map,
            // either as new key-value pair or as new value to an existing key
            map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
        });
    } catch (IOException e) {
        e.printStackTrace();
    }

    // print the map content
    map.forEach((key, value) -> System.out.println(key + " : " + value));
}
  

您将不得不同时使用以下导入:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;