如何在Java中使用相同的字符串进行GROUP BY

时间:2016-10-20 17:20:15

标签: java

我有一个字符串的Arraylist,我需要返回相同字符串的Arraylist索引。

例如

Arraylist[0]: IPAddress

Arraylist[1]: DomainName

Arraylist[2]: IPAddress

Arraylist[3]: Filesize

输出应为:

Arraylist[0]
IPAddress|0,2 //0,2 denotes the arraylist index that is of the same

Arraylist[1]
DomainName|1

Arraylist[2]
Filesize|3

知道如何实现这一目标?

我所做的是:

for(int i=0; i<arr.size(); i++){
   if(arr.get(i).equals(arr.size()-1)){
      //print index


   }
}

2 个答案:

答案 0 :(得分:1)

使用Java8流

    List<String> strings = Arrays.asList("IPAddress", "DomainName", "IPAddress", "Filesize");
    Map<String, List<Integer>> map = IntStream.range(0, strings.size()).boxed().collect(Collectors.groupingBy(strings::get));
    System.out.println(map);

输出

{DomainName=[1], Filesize=[3], IPAddress=[0, 2]}

以有序的方式获得结果

    Map<String, List<Integer>> map = IntStream.range(0, strings.size())
                                    .boxed()
                                    .collect(Collectors.groupingBy(strings::get, LinkedHashMap::new, Collectors.toList()));

答案 1 :(得分:0)

机械步骤相当简单:

  • 获取一个可以支持密钥(列表中的字符串)的集合,以及表示它们出现的索引的值列表(这将是另一个ArrayList)。
  • 如果元素存在于集合中,只需将索引添加到其值中即可。
  • 否则,创建一个新列表,将索引添加到该列表中,然后将其添加到集合中。

以下是一些示例代码。

final List<String> list = new ArrayList<String>() {{
    add("IPAddress");
    add("DomainName");
    add("IPAddress");
    add("Filesize");
}};

final Map<String, List<Integer>> correlations = new LinkedHashMap<>();
for (int i = 0; i < list.size(); i++) {
    final String key = list.get(i);
    if (correlations.containsKey(key)) {
        correlations.get(key).add(i);
    } else {
        final List<Integer> indexList = new ArrayList<>();
        indexList.add(i);
        correlations.put(key, indexList);
    }
}

对上述内容的任何优化都留给读者练习。