У меня есть массив из 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
    }
}
-1
cuber 24 Апр 2017 в 05:00

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();
    }
}
4
Tibrogargan 24 Апр 2017 в 02:13

Вот решение, использующее Set для поддержания уникальности. Это позволяет заново изобретать все функциональные возможности для проверки на наличие дубликатов. Он использует тот факт, что метод add интерфейса Set возвращает true, если объект был добавлен в набор. Под прикрытием, конечно, он использует equals метод Color.

В случае обнаружения дубликата мы неоднократно пытаемся немного изменить 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]);
        }
    }
}
0
Dawood ibn Kareem 24 Апр 2017 в 05:19
43578660