【问题标题】:How to look for exact same color in an array in Java如何在Java中的数组中查找完全相同的颜色
【发布时间】:2017-09-20 13:52:54
【问题描述】:

我有一个 24 种颜色的数组。有时,当我生成它时,我会得到具有完全相同 RGB 值的颜色。我想要做的是在数组中找到重复项并将匹配的值更改为 1 或 2。只是让它不再匹配。

这是我的颜色数组。请注意,有 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
    }
}

【问题讨论】:

  • 有什么特殊原因不能使用colorArray[i].equals(matchingColor)
  • 对于我的比较,比较参考而不是对象似乎效果更好。我不反对它,但宁愿只是比较参考。 @Tibrogargan
  • 为什么不将它们生成为某种Set,并在Set 具有正确数量的元素时停止?
  • 另外,可能有两个不同的Color 对象具有相同的 RGB 值,因此比较参考是不好的。
  • equals 不做参考比较,它依赖于对象实现。在这种情况下:当且仅当参数不为 null 并且是具有与此对象相同的红色、绿色、蓝色和 alpha 值的 Color 对象时,结果才为真。

标签: java arrays


【解决方案1】:

这是一个使用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]);
        }
    }
}

【讨论】:

    【解决方案2】:

    学习你使用的类的 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();
        }
    }
    

    【讨论】:

    • 如何检查 colorArray[i].equals 数组中的另一种颜色?
    • 要检查重复项,最好使用数据类型来存储支持此类功能的元素。原始数组对此并不是非常有用 - 您必须手动搜索整个事物。一套可能有用(正如@DawoodibnKareem 建议的那样)
    • 先看this
    • 我不相信这适用于所有情况。当您修改colorArray[i] 时,您可以将其设置为与数组中其他内容相同的颜色。我假设这打算放在第二个循环中,其中matchingColor 迭代数组中的颜色 - 所以如果colorArray[i] 更改为一个已经的值,那就不好了matchingColor 在一些迭代中。
    • 如果你有很多相同的颜色,它也不起作用,因为它可能最终陷入无限循环。仅使用brigher/darker 是一个简单的解决方法,但它是朝着涵盖所有边缘情况的良好解决方案迈出的一步。需要注意不要过度设计。
    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多