如何获得具有最大数字和唯一键的String的每个数组?

时间:2019-03-23 21:55:08

标签: java arraylist

我有一个ArrayList<String[]>,其中包含以下数据:

[Branford, Paddock Lane, 136, 1]
[Branford, Paddock Lane, 42, 3]
[Branford, Hartford Road, 117, 0]
[Branford, Hartford Road, 45, 3]
[McAlister, Sigourney Street, 103, 3]
[McAlister, Sigourney Street, 61, 1]
[McAlister, Stanford Street, 1, 3]
[McAlister, Stanford Street, 34, 4]
[Cypress Gardens, Route 115, 112, 12]
[Cypress Gardens, Park Road, 10, 4]
[Cypress Gardens, Park Road, 49, 4]
[Cypress Gardens, Old Farm Road, 28, 5]
[Cypress Gardens, Old Farm Road, 79, 3]
[Germfask, Exeter Court, 28, 7]
[Germfask, South Boulevard, 119, 6]
[Germfask, South Boulevard, 135, 3]
[Minford, Liberty Lane, 41, 3]
[Minford, Liberty Lane, 52, 4]
[Minford, State Street West, 103, 0]

每个字符串数组中的第一个元素是城市的名称,最后一个元素是计数器。我需要提取将包含字符串数组但仅包含一个城市名称和最大计数器的数据。例如,对于Branford,结果将是[Branford, Paddock Lane, 42, 3]。如何仅通过forEach循环提取此数据? 谢谢。

我尝试使用forEachArrayList,并将当前元素中的每个计数器与城市名称相同的下一个计数器进行比较。

输出不符合预期,因为它不包含任何数据。

final int[] max = {Integer.parseInt(arrayListSrc.get(0)[3])};
ArrayList<String[]> arrayList = new ArrayList<>(1);
final int[] index = {0};
arrayListSrc.forEach(strings -> {
  if (strings[0].equals(arrayListSrc.get(index[0])[0])) {
    if (Integer.parseInt(strings[3]) < Integer.parseInt(arrayListSrc.get(index[0])[3])) {
      if (Integer.parseInt(arrayListSrc.get(index[0])[3]) > max[0]) {
        max[0] = Integer.parseInt(arrayListSrc.get(index[0])[3]);
        arrayList.add(strings);
      }
    }
  }
  index[0]++;
});

2 个答案:

答案 0 :(得分:2)

首先,下次尝试将String[]映射到合适的数据结构,因为它将更容易处理。只需创建一个合适的类,那就是面向对象编程的目的。

但是,要回答这个问题,您可以通过以下方式映射普通List<String[]>

Map<String, String[]> results = source.stream().collect(
        Collectors.toMap(s -> s[0], Function.identity(),
                BinaryOperator.maxBy(
                        Comparator.comparing(s -> Integer.valueOf(s[3])))));

结果是一个Map,其中的键代表城市名称,其值是计数器最大化的原始String[]。此解决方案不需要使用forEach(),而是通过流操作来达到预期的结果。

但是,您可以使用forEach()打印或进一步处理结果:

results.forEach((s, strings) -> {
    System.out.println(s + " " + Arrays.toString(strings));
});

答案 1 :(得分:0)

我有这样的东西:

Map<String, String[]> result = new TreeMap<>();


for(String[] s : source) {
    if(!result.containsKey(s[0])){
        result.put(s[0], s);
    } else if (Integer.valueOf(result.get(s[0])[3]) < Integer.valueOf(s[3])) {
        result.put(s[0], s);
    }
}

for(String k : result.keySet()) {
    System.out.println(k + ": " + Arrays.toString(result.get(k)));
}

这应该打印:

Branford: [Branford, Paddock Lane, 42, 3]
Cypress Gardens: [Cypress Gardens, Route 115, 112, 12]
Germfask: [Germfask, Exeter Court, 28, 7]
McAlister: [McAlister, Stanford Street, 34, 4]
Minford: [Minford, Liberty Lane, 52, 4]

是您追求的结果吗?您确实面临这样的挑战,即您拥有匹配次数相同的条目。