查找数组中相同数字的总和

时间:2017-01-09 19:09:23

标签: java

我想在数组中加总相同的数字。输出是:

20
20
20
60

但我想要输出:

30 60

这是我的代码:

int sum = 0;
int array[] = {10, 10, 10, 20, 30, 30};

for (int i = 0; i < array.length - 1; i++) {
    for (int k = i + 1; k < array.length; k++) {
        if(i != k && array[i] == array[k]) {
            sum = array[i] + array[k];

            System.out.println(sum);
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您可以使用HashMap<Integer, Integer>执行此操作:

Map<Integer, Integer> sums = new HashMap<>();    

int[] arr = {10,10,10,20,30,30};
for(int i=0,n=arr.length;i<n;i++){
    sums.put(arr[i], sums.get(arr[i])==null?arr[i]:sums.get(arr[i])+arr[i]);
}

这会将Array中的每个唯一值与其各自的总和进行分组。

答案 1 :(得分:0)

有多种方法:

我们都喜欢Java8&lt; 3

String result = Stream.of(3, 4, 5, 3, 4, 5, 5, 4, 2).
            collect(Collectors.groupingBy(Function.identity())).
            entrySet().stream().
                map(e->e.getKey() * e.getValue().size()).
                collect(StringBuilder::new, (s, i)->s.append(i).append(", "), (a, b)->a.append(b)).
                    toString();

构建一个表,列出具有相同值的所有整数,将其转换为相等数字的总和,并将其收集到StringBuilder

使用表格

int[] test = new int[]{3, 4, 5, 3, 4, 5, 5, 4, 2};

Map<Integer, Integer> ints = new HashMap<>();
for(int i : test)
    ints.put(i, ints.getOrDefault(i, 0) + i);

System.out.println(ints.toString());

此代码只是构建一个包含每个整数的表,并且它的相应计数乘以该整数。

天真的方法

为了完整起见:

int[] test = new int[]{3, 4, 5, 3, 4, 5, 5, 4, 2};
boolean[] flags = new boolean[test.length];

for(int i = 0; i < test.length; i++)
{
    //ignore already processed items
    if(flags[i])
        continue;

    flags[i] = true;

    //sum up and mark processed elements as processed
    int tmp = test[i];
    for(int j = i + 1; j < test.length; j++)
        if(test[j] == test[i]) {
            flags[j] = true;
            tmp += test[i];
        }

    System.out.print(tmp + " ");
}

此代码的工作原理是从第一个元素开始,查找所有相等的值,将这些值标记为已访问(以避免重复 - flags),打印它们的总和并继续处理数组中的下一个未处理的元素。

答案 2 :(得分:0)

您可以使用Java 8 stream()轻松完成此操作,例如:

public static void main(String[] args) throws Exception {
    int[] array = {10, 10, 10, 20, 30, 30};
    Map<Integer, Long> mappings = 
            Arrays.stream(array)
            .boxed()
            .collect(Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()));
    for(Integer key : mappings.keySet()){
        if(mappings.get(key) > 1){
            System.out.println(key * mappings.get(key));
        }
    }

}