Массивы:Подсчет, Сравнение и увеличение
-
08-07-2019 - |
Вопрос
У-у-у, слава богу, теперь я пришел к пониманию массивов.
Теперь у меня есть 2 массива!
int colorvalues[][] = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};
Представьте это как картинку размером 4х4 пикселя
Теперь я хочу создать гистограмму, распределение цветовых значений от 0 до 255.Например, здесь у меня есть 2*255, 2*127, 5*34 и так далее.
Итак, я создал гистограмму int[] = new int [255];
Чтобы проверить, верны ли мои цветовые значения, я написал:
for(int i=0; i < colorvalues.length; i++){
for (int j = 0; j < colorvalues.length; j++){
System.out.println("Colorvalue in Array " + i + "." + j + " is" + colorvalues[i][j]);
}
}
Пока все идет так хорошо.Теперь, как мне написать процедуру, которая переходит в histogram [255] от 0 до 255 и сравнивает ее со значением colorvalues[][], и если, например, histogram[34] сравнивается с colorvalues[][], она добавляет 5 к histogram [34].Потому что в colorvalues 5 раз по 34[][].
Возможно, мое мышление неверно, и я должен был иметь гистограмму [255] [], 255 для значений цвета от 0 до 255 и другую для счетчика.Но даже тогда, как мне это осознать?
Решение
На самом деле вам не следует перебирать гистограмму и для каждого возможного значения перебирать изображение.Повторения по изображению должно быть достаточно:
for(int i=0; i < colorvalues.length; i++){
for (int j = 0; j < colorvalues.length; j++){
histogram[colorvalues[i][j]]++;
}
}
Вы можете просто использовать значение яркости в вашем изображении в качестве Указатель в массив гистограмм.
И вам не нужно создавать массив массивов только для сохранения счетчика.Помните, что массив - это не что иное, как список "ячеек" для определенного значения.ан int[]
это просто диапазон "ячеек", которые могут содержать целочисленное значение.Это ваш счет.Тот самый Указатель в этом списке ячеек указано ваше значение яркости для гистограммы.Для каждого массива у вас есть эти две части информации:Индекс ячейки и значение в этой ячейке.Вам просто нужно выяснить, как использовать и то, и другое.
И как Скорость PSpeed примечания в комментарии, возможно, вы захотите убедиться, что код на самом деле не будет пытаться получить доступ к значениям за пределами этого массива:
if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
histogram[colorvalues[i][j]]++;
}
Это необходимо, потому что ваши значения цвета следующие int
s, то есть они могут содержать значения от -2147483648 до 2147483647.Это намного больший диапазон, чем может вместить ваша гистограмма.Таким образом, если значение цвета окажется, например, равным 3456, программа остановится в цикле из-за ArrayIndexOutOfBoundsException
.Поскольку код trid для доступа к значению в histogram
массив с индексом 3456, который намного превышает максимально допустимый индекс 255.
ETA: Что касается вашей гистограммы, являющейся int[255]
:Я совершенно упустил это из виду, извини.При создании нового массива в Java вы указываете длина, а не максимальный индекс.Таким образом, все, что вы там используете, ровно на единицу больше максимального индекса, который может быть использован в массиве.Итак new int[256]
представляет собой массив с индексами от 0 до 255.
Другие советы
У меня было бы желание добавить значения гистограммы в древовидную карту, где ключ карты - это значение цвета, а значение карты - это количество.
Карта автоматически увеличится в размерах, никаких проблем с выходом индекса за пределы и т.д.он будет автоматически отсортирован по размеру.