繁体   English   中英

我如何从arraylist制作一个哈希表,其中具有重复值的一列是键和对应的行作为值

[英]How do I make a hashmap out of arraylist where one column with repeat values are the keys and corresponding lines as values

我知道这是一个基本问题,但是由于某些原因,尽管过去几天我一直在尝试和(寻找解决方案),但我仍无法在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列中,我有重复的值“ Yes”,“ NO”和“ Maybe”(大写字母很少,小写字母很少)。我必须创建一个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>> ,则可以轻松地将每个字符串数组中的字符串连接起来,然后将它们放入新的映射中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM