2017-04-24 46 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] .equals數組中的另一種顏色? – cuber

+0

要檢查重複項,最好使用數據類型來存儲支持此類功能的元素。原始數組並不是非常有用 - 你必須手動搜索整個事物。一套可能是有用的(如@DawoodibnKareem建議) – Tibrogargan

+0

好的,我會做那部分。 – cuber

0

以下是使用Set來保持唯一性的解決方案。這節省了重新發明所有功能以檢查重複項。它利用了這樣的事實:如果對象已被添加到集合中,則Set接口的add方法返回true。當然,在封面下,它使用Colorequals方法。

如果發現重複,我們會反覆嘗試稍微修改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]); 
     } 
    } 
} 
相關問題