2016-07-06 26 views
0

私はまだ答えに固執しています。このプログラムは一意の値を出力しますが、これらの一意の値の合計を正しく取得することはできません。すべてのヘルプは高く評価されJavaの整数配列の一意の値の合計を表示します

public static void main(String args[]){ 
    int sum = 0; 
    Integer[] numbers = {1,2,23,43,23,56,7,9,11,12,12,67,54,23,56,54,43,2,1,19}; 
    Set<Integer> setUniqueNumbers = new LinkedHashSet<Integer>(); 

    for (int x : numbers) { 
     setUniqueNumbers.add(x); 
    } 
    for (Integer x : setUniqueNumbers) { 
     System.out.println(x); 
     for (int i=0; i<=x; i++){ 
      sum += i; 
     } 
    } 
    System.out.println(sum); 
} 
+3

セットの値ではなく、インデックスを加算しています。 – OldProgrammer

+2

'for(int i = 0; i <= x; i ++)'ループは何をしていますか? – khelwood

答えて

4

これは、Java 8言語の追加を利用するための偉大な例です。

int sum = Arrays.stream(numbers).distinct().collect(Collectors.summingInt(Integer::intValue)); 

この行はSystem.out.println前の最後の行までSet宣言から始まるあなたのコード内のすべてを置き換えます。

+1

これより少し短い: 'Arrays.stream(numbers).distinct()。mapToInt(i - > i).sum()' – xehpuk

-1

バグが、それはこのループは必要

for (int i=0; i<=x; i++){ 
    sum += i; 
} 

はありません

sum += x; 
2

でなければなりません

sum += i; 

ライン上にある、あなたので」追加するiラット彼女はセット内の実際の整数よりもここでは0からxまでの数字をすべてsumに追加しています。だから23の場合、sumを23で増やすのではなく、1 + 2 + 3 + 4 + 5 + ... + 23をsumに追加しています。あなたがする必要があるのは、上記のループを省略してsumにXを追加するシンプルなラインと交換することができるので、Xを追加で

sum += x; 
1

1は、低レベルのループの周りなどをつつく場合は、エラーのこの種は、常に最高のは、低レベルのコードを取り除くとJava 8つのAPIを使用取得する、ある をoccures:

Integer[] numbers = {1,2,23,43,23,56,7,9,11,12,12,67,54,23,56,54,43,2,1,19}; 

int sum = Arrays.stream(numbers) 
     .distinct() 
     .mapToInt(Integer::intValue) 
     .sum(); 

このように、かろうじてありミスのためのスペース。 配列がint型の場合、コードはさらに短くなります。

int[] intnumbers = {1,2,23,43,23,56,7,9,11,12,12,67,54,23,56,54,43,2,1,19}; 
int sumofints = Arrays.stream(intnumbers) 
       .distinct() 
       .sum(); 
関連する問題