2016-09-21 5 views
2

現在、配列内に数値が表示されるメソッドを作成しようとしています。配列にnumberがすでに存在する場合はスキップしませんか?

私の方法は次のとおりです。

public void freq(int[] arr) { 
     Arrays.sort(arr); 
     String output = ""; 
     int count = 0; 
     for (int i = 0; i < arr.length; i++) { 
      if (this.helper(arr[i]) == true) { 
       i++; 
      } else if (this.helper(arr[i]) == false) { 
       for (int k : arr) { 
        if (k == arr[i]) { 
         count++; 
        } 
       } 
       System.out.println("Number of instances to: " + arr[i] + " : " + count); 
       count = 0; 
      } 
     } 
    } 

ヘルパークラスは、それがチェックする程度だ数は、すでに確認されているかどうかを確認するために使用されます。私はすでに確認されている番号を格納するためのArrayListを使用しています:

private List<Integer> existingInt = new ArrayList<Integer>(); 

方法ヘルパーが書かれている:番号が存在するかどう

public boolean helper(int i) { 
    boolean alreadyExists = false; 
    for (int k : existingInt) { 
     if (i == k) { 
      alreadyExists = true; 
      return alreadyExists; 
     } else { 
      existingInt.add(i); 
      alreadyExists = false; 
      return alreadyExists; 
     } 
    } 
    return alreadyExists; 
} 

ヘルパーは、真または偽のブール値を返します。その後、if文でtrueかfalseを返すかどうかを調べます。 trueの場合、私は、スキップ(または少なくともをしよう)と:

要するに
if (this.helper(arr[i]) == true) { 
    i++; 
} 

、私の方法は、整数の配列にoccurancesの数をカウントします。私のヘルパーメソッドがtrueを返す場合、それはしません、チェックをスキップします。

+1

[配列内の数字の発生をカウント]の可能複製(http://stackoverflow.com/質問/ 11608515/count-occurrence-of-number-in-array) –

+0

@StephenPはい、いいえ。彼は自分のコードのどこにエラーがあるか知りたいと思っています。このようなメソッドを実装しているにも関わらず、特別な配列の出現をどのように数えるかではありません。可能なより良い場所は[SE codereview](http://codereview.stackexchange.com/)です。 – Zabuza

+1

@ Zabuzaしかし、SE codereviewはバグのコードをデバッグすることを望まないということを私に伝えています。 –

答えて

3

あなたは、配列をソートしているので、あなたがこの

for (int i = 0; i < arr.length;) { 
     int count = 1; 
     int num = arr[i]; 
     while(++i < arr.length && arr[i] == num) { 
      count++; 
     } 
     System.out.println("Number of instances to: " + num + " : " + count); 
    } 
1

あなたは他の部分からreturn alreadyExists;を削除する必要があります。最初の項目がiでなければ自動的にfalseを返します。

編集:メソッドが不必要に複雑です。あなたはこれを使用することができます:

public boolean helper(int i) { 
    for (int k : existingInt) { 
     if (i == k) { 
      return true; 
     } 
    } 
    existingInt.add(i); 
    return false; 
} 

はさらに良いことに、あなたはHashSetのを使用することができます:あなたのexistingIntが空の場合、あなたはexistingIntに新しい項目を追加するためにadd(i)を呼び出すことはありません

private HashSet<Integer> existingInt = new HashSet<Integer>(); 

public boolean helper(int i) { 
    return existingInt.add(i); 
} 
+0

メソッドをやり直してみました。ここでは、alreadyExistsはfalseになり、番号が存在する場合にのみ変更されました(alreadyExists = true)。それでも同じ結果。 参考用画像: http://i.imgur.com/leT6fDM.png –

+0

答えを編集しました。 – uoyilmaz

+0

マイナーなリファクタリングを推奨しますが、問題の解決策はお勧めしません。 –

0

。したがって、existingIntはヘルパーコードに従って常に空になります。

iterationステートメントには参加しないために起こります。

public boolean helper(int i) { 
    if (!existingInt.contains(i)) { 
     existingInt.add(i); 
     return false; 
    } 

    return true; 
} 

は実際に、あなたは、出現のカウントと整数の配列にGROUPBYアイデンティティ操作をしたいです。 Java 8 Streamsを使用するように簡単です:

Arrays.stream(array) 
    .boxed() 
    .collect(groupingBy(
     Function.identity(), 
     counting() 
    )); 

あなたは、各要素の数とMap<Integer, Long>を取得します。

+2

親愛なるdownvoterは、この解決策で間違っていることを説明すること自由に –

+0

ちょっと弟、私はあなたのヘルパー機能を使用しようとし、実際には、1つの部分を除いて、正しいデータを表示しました。何らかの理由で、番号77が数えられていない、どうして?その他の数字はすべて正しく表示されますが、77は表示されません。 –

+0

「77」の問題ではありません。印刷で間違っているかもしれませんか? –

1

を行うことができますが、マップキーとして、地図で見つかった数字を追​​跡すること、およびとしてマップをインクリメントすることにより発生をカウントすることができます数が何回現れたかのカウント。

最初にその番号を見つけたときに地図に数字を入力する唯一の方法があります。

私はで実装されたSortedMapを使用しています。keySetを取得すると、数値が昇順にソートされて出力されます。

これがコンパイルされ、デフォルトのパッケージで実行することができますテストmainとの完全なクラスです:

import java.util.SortedMap; 
import java.util.TreeMap; 

public class Counter 
{ 
    public void printFreq(final int[] numbers) 
    { 
     // Use a sorted map so our output is ascending. 
     final SortedMap<Integer, Integer> numCounts = new TreeMap<>(); 

     // Count occurrences in the provided numbers 
     for (final Integer i : numbers) 
     { 
      Integer count = numCounts.get(i); // Get the current count 
      if (count == null) count = 0;  // or init it to zero if there isn't one 
      numCounts.put(i, ++count);   // Increment count and put it (back) in the map 
     } 

     // Output the counts 
     for (final Integer n : numCounts.keySet()) 
     { 
      System.out.printf("%d : %d\n", n, numCounts.get(n)); 
     } 
    } 


    public static void main(String[] args) 
    { 
     final Counter c = new Counter(); 
     final int[] nums = { 3, 8, 1, 3, 12, 1, 3, 42, 12, 8 }; 
     c.printFreq(nums); 
    } 
} 
+0

偉大な探してコード、仕事も同様に行います。コードは私の配列で完璧に動作し、正しい出力を表示します。しかし、これは宿題なので、私は最初に問題があったコードを使用しなければならないでしょう。とても兄さん、ありがとう、私は配列で作業する次回のために覚えていますが、! –

関連する問題