2017-04-24 9 views
-1

私は24色の配列を持っています。時々私はそれを生成するとき、私はまったく同じRGB値を持つ色を取得します。私がしたいのは、配列内の重複を見つけて、1または2のように一致の値を変更することです。それがもう一致しないようにします。Javaの配列で正確に同じ色を探す方法

ここは私の色の配列です。正確な赤の3色があることに注意してください。私はそれぞれがお互いに少しずつ異なっていてほしいです。 Rチャンネルは同じにしておきますが、GまたはBチャンネルを1または2の数字よりも高く変更してください。

Color Array: [java.awt.Color[r=255,g=194,b=23], java.awt.Color[r=255,g=0,b=0], java.awt.Color[r=255,g=0,b=0], java.awt.Color[r=0,g=67,b=255], java.awt.Color[r=0,g=255,b=175], java.awt.Color[r=255,g=13,b=10], java.awt.Color[r=255,g=115,b=43], java.awt.Color[r=2,g=92,b=255], java.awt.Color[r=241,g=219,b=255], java.awt.Color[r=255,g=194,b=0], java.awt.Color[r=231,g=210,b=255], java.awt.Color[r=0,g=43,b=255], java.awt.Color[r=255,g=80,b=0], java.awt.Color[r=255,g=205,b=27], java.awt.Color[r=255,g=0,b=9], java.awt.Color[r=205,g=199,b=255], java.awt.Color[r=0,g=44,b=255], java.awt.Color[r=255,g=0,b=0], java.awt.Color[r=21,g=255,b=219], java.awt.Color[r=255,g=199,b=51], java.awt.Color[r=255,g=82,b=2], java.awt.Color[r=215,g=198,b=255], java.awt.Color[r=0,g=255,b=203], java.awt.Color[r=255,g=98,b=28]] 

私が考えていたのは、配列を反復処理することでした。

for(int i = 0; i < colorArray.length; i++){ 
    if(colorArray[i] == //not sure what this would be equal to as it will be checking all the values in the array) { 
     colorArray[i].getBlue() = matchingColor.getBlue() += 1; 
     colorArray[i].getGreen() matchingColor.getGreen() += 2; //These are example values just to make sure that they have no match 
    } 
} 
+3

あなたが使用することはできません任意の特定の理由[ 'colorArray [I] .equals(matchingColor)'](https://docs.oracle.com/javase/7/docs/api/java/awt/ Color.html#equals(java.lang.Object))? – Tibrogargan

+0

私の比較のためにオブジェクトの代わりに参照を比較している方がうまくいくようです。私はそれに反対していませんが、参照を比較するだけです。 @Tibrogargan – cuber

+1

何らかの 'Set'にそれらを生成せず、' Set'が正しい数の要素を持っているときに停止してください。 –

答えて

4

あなたが使用するクラスのAPIを学習することは本当に役に立ちます。

for(int i = 0; i < colorArray.length; i++) { 
    // use while in case the color is black/white. (May thrash for few iterations) 
    while (colorArray[i].equals(matchingColor)) { 
     colorArray[i] = (Math.random() < 0.5)?colorArray[i].brighter():colorArray[i].darker(); 
    } 
} 
+0

colorArray [i]。が配列の別の色と等しいかどうかを確認するにはどうすればよいですか? – cuber

+0

重複をチェックするには、この種の機能をサポートする要素を格納するデータ型を使用する方がよいでしょう。プリミティブ配列はそれほど有用ではありません。手動で全体を検索する必要があります。 (@DawoodibnKareemの示唆しているように)セットが役に立つかもしれません。 – Tibrogargan

+0

ok、私はその部分を行います。 – cuber

0

ここでは、一意性を維持するためにSetを使用する方法を示します。これにより、重複をチェックするためのすべての機能を再発明する必要がなくなります。 Setインターフェイスのaddメソッドが、オブジェクトがセットに追加されている場合はtrueを返すという事実を利用します。もちろん、カバーの下には、の方法がColorです。

重複が見つかった場合、私たちはユニークなものになるまで、その3つのコンポーネントのビットごとの排他的論理和を行うことによって、Colorの修正を繰り返し試みます。

public void deduplicate(Color[] colors) { 
    Set<Color> uniqueColors = new HashSet<>(); 
    for (int which = 0; which < colors.length; which++) { 
     Color originalColor = colors[which]; 
     boolean unique = uniqueColors.add(originalColor); 
     for (int modifyBy = 1; !unique ; modifyBy++) { 
      colors[which] = new Color(
        originalColor.getRed()^modifyBy, 
        originalColor.getGreen()^modifyBy, 
        originalColor.getBlue()^modifyBy); 
      unique = uniqueColors.add(colors[which]); 
     } 
    } 
} 
関連する問題