我知道这是一个基本问题,但由于某种原因,尽管我一直在尝试并(寻找解决方案(在过去的几天里,我无法在 java 中解决这个问题...... 我有一个制表符分隔的文件(超过 8000 行的大文件(,其中包含多列(这些列中很少有空格和元素之间的":"(。我已经读取了这个文件,并通过逐行读取文件将其存储为 ArrayList
String filepath = "/home/path/T1.csv";
ArrayList<String[]> listOfLines = new ArrayList<>();
ArrayList<String> column8 = new ArrayList <>();
Scanner scan = new Scanner(new File(filepath)) ;
while(scan.hasNextLine())
{String line = scan.nextLine();listOfLines.add(line.split("\t+"));column8.add(line.split("\t+"));}
在第 8 列中,我有"是"、"否"和"也许"的重复值(大写很少,小写很少(。我必须创建一个 HashMap(赞赏替代方法的建议(,其中此列的值是键,并且对应于该键的整行是值,即一个键多个值,因此最终结果是行捆绑基于第 8 列的常见条目"是、否和可能"。
输入文件包含此格式的行,并且某些位置的列数(用制表符分隔(超过 8
1.456 Fri Jun 01 16:38:01 IST 2018 APB electron microscopy P5299 raw processed no
Incorrect Term. {"electron microscopy"}
1.5457 Fri Jun 01 12:16:03 IST 2018 JIAU Crystallography P1189 raw raw yes Term
too broad. {"Rietveld refinements"}
1.557 Fri Jun 01 12:16:03 IST 2018 JAU positron collider P72411 processed processed maybe
1.567 Fri Jun 01 12:16:04 IST 2018 JAU positron collider P72411 processed processed maybe
我想要的结果是根据第 8 列的值捆绑行,如下所示
yes bundle
1.5457 Fri Jun 01 12:16:03 IST 2018 JIAU Crystallography P1189 raw raw yes Term
too broad. {"Rietveld refinements"}
no bundle
1.456 Fri Jun 01 16:38:01 IST 2018 APB electron microscopy P5299 raw processed no
Incorrect Term. {"electron microscopy"}
maybe bundle
1.557 Fri Jun 01 12:16:03 IST 2018 JAU positron collider P72411 processed processed maybe
1.567 Fri Jun 01 12:16:04 IST 2018 JAU positron collider P72411 processed processed maybe
你可以做这样的事情:
// toLowerCase for case insensitive comparison of column 8
listOfLines.forEach(x -> x[7] = x[7].toLowerCase(Locale.US));
Map<String, List<String[]>> map = listOfLines.stream()
.collect(Collectors.groupingBy(s -> s[7]));
这会产生一个Map<String, List<String[]>>
。如果你想要一个Map<String, List<String>>
,你可以轻松地连接每个字符串数组中的字符串并将它们放在一个新的映射中。