Массивы: подсчет, сравнение и увеличение - PullRequest
0 голосов
/ 29 ноября 2009

Woohoo, я пришел в массивы сейчас, слава богу.

Теперь у меня есть 2 массива!

int colorvalues[][]  = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};

Представьте, что это изображение размером 4x4 пикселя

Теперь я хочу создать гистограмму, распределение значений цвета от 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]);
     }
 }

Пока все хорошо. Теперь, как мне написать процедуру, которая идет в гистограмме [255] от 0 до 255 и сравнивает ее со значением colorvalues ​​[] [], и если, например, гистограмма [34] сравнивается с colorvalues ​​[] [] это добавляет 5 к гистограмме [34]. Потому что в цветовых значениях 5 раз 34 [] [].

Возможно, мое мышление не так, и я должен был иметь гистограмму [255] [], 255 для значений цвета от 0 до 255 и другую для счетчика. Даже тогда, как я понимаю это?

Ответы [ 2 ]

3 голосов
/ 29 ноября 2009

Вы на самом деле не должны выполнять итерацию по гистограмме и для каждого возможного значения выполнять итерацию по изображению. Итерации по изображению должно быть достаточно:

for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
             histogram[colorvalues[i][j]]++;
     }
}

Вы можете просто взять значение яркости на вашем изображении в виде index в массиве гистограмм.

И вам не нужно создавать массив массивов только для того, чтобы сохранить счетчик. Помните, что массив - это не что иное, как список «ячеек» для определенного значения. int[] - это просто диапазон «ячеек», которые могут содержать целочисленное значение. Это твой счет. Индекс в этом списке ячеек - это ваше значение яркости для гистограммы. Для каждого массива у вас есть эти две части информации: индекс ячейки и значение в этой ячейке. Вам просто нужно выяснить, как использовать оба.

И, как отмечает PSpeed ​​ в комментарии, вы можете убедиться, что код на самом деле не будет пытаться получить доступ к значениям за пределами этого массива:

if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
    histogram[colorvalues[i][j]]++;
}

Это необходимо, потому что ваши значения цвета равны int с, то есть они могут содержать значения от минус 2147483648 до 2147483647. Это намного больший диапазон, чем ваша гистограмма. Так, если значение цвета, например, равно 3456, программа остановится в цикле из-за ArrayIndexOutOfBoundsException. Поскольку код обращается к значению в массиве histogram с индексом 3456, который намного превышает максимально допустимый индекс 255.

ETA: Что касается вашей гистограммы int[255]: я полностью пропустил эту, извините. При создании нового массива в Java вы указываете length , а не максимальный индекс. Таким образом, все, что вы используете, больше на единицу, чем максимальный индекс, который можно использовать в массиве. Итак, new int[256] - это массив с индексами от 0 до 255.

0 голосов
/ 29 ноября 2009

Я бы хотел добавить значения гистограммы в TreeMap, где ключ карты - это значение цвета, а значение карты - это счетчик.

Карта будет автоматически увеличиваться в размере, никаких проблем с индексом за пределами границ и т. Д. Она будет автоматически отсортирована по размеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...