2011-02-01 18 views
2

だから、基本的に、私は10個の値で、1つの配列を持っている...配列内に重複するインデックス値が存在するかどうかを確認しますか?

int[] input = new int[10]; 

ユーザは、各値の入力を制御します。

アレイ内の値が他の値と等しいかどうかを確認するには、どのような方法が良いでしょうか?

編集:作品が重複番号がインデックス隣接している限り尋ねる

public static void main(String[] args) { 
    P2 numbers = new P2(); 

    for (int i = 0; i < numbers.input.length; i++) { 
     numbers.input[i] = numbers.scan.nextInt(); 
    } 
    numbers.Check(); 
    if (numbers.Check()) { System.out.println("Duplicate"); } 
    if (numbers.Check() == false) { System.out.println("NOT Duplicate"); } 
} 

public boolean Check() { 
     int length = input.length; 
     for(int i : input) { 
      for(int j = i + 1; j < length; j++) { 
       if(input[i] == input[j]) return true; 
      } 
     } 
     return false; 
    } 

コード。

答えて

8

実際には配列に10個の値しかない場合は、重複したループを見つけた方がよいでしょう。

int length = input.length; 
for(int i = 0; i < length; i++) { 
    for(int j = i + 1; j < length; j++) { 
     if(intput[i] == input[j]) return true; 
    } 
}​ 

あなたが大量にスケールアップすることを期待している場合は、HashSetのを移入し、あなたがHashSetの中で既にの値を見つけたとき壊す方がいいでしょう。

HashSet<Integer> set = new HashSet<Integer>(); 
for(int i : input) { 
    if(set.contains(i)) return true; 
    set.add(i); 
}​ 
+0

ありがとうございました!あなたは私の疑惑を確認しました:] – Johannes

+0

'i'は入力値が与えられていますが、その後はインデックスとして使用されます。 –

+0

@Stephen Denne:真実。それを指摘してくれてありがとう。私はそれを修正したと思う。 – StriplingWarrior

0

また、配列をソートし、重複を迅速にスキャンすることができます。ハッシュセットを構築するのと比較して、それは多くのメモリを使用することはありませんが、より遅くなります。

1

あなたは

  1. は二つのループのすべての値(非効率)
  2. ソート配列を比較した後にのみ隣接する値を比較することができました。これは、特に長いアレイの場合は、より効率的です。

最初のものは実装が非常に簡単で、配列の長さが10の場合はこれで十分です。

1

保存int値が小さい非負の値である場合、BitSetは適切であるかもしれない:

BitSet set = new BitSet(); 
for(int i : input) { 
    if(set.get(i)) return true; 
    set.set(i); 
}​ 

かわり値、およびそれらの多くの広い範囲が、低い可能性を持っている場合(つまり、重複がないことを期待し、それを単に確認する必要がある)場合は、intをハッシュし、ハッシュの下位13ビットのBitSet(8192)を使用します(たとえば、)。それは約1kだけを使用します。これは重複がないことを簡単に確認するために使用できますが、ハッシュの衝突が見つかった場合は、効率の低い方法で再確認する必要があります。

関連する問題