2015-03-10 4 views
-1

У меня есть массив массивов с переменным цветовымДобавление элемента массив из массива

Color [] [] bin = new Color [64] []; 

после этого я хочу, чтобы вставить цвета в этот массив Im обхвата через список цветов и tmpColor является конкретным цветом в петля. Мне нужно вставить его в конкретный цикл, который он принадлежит.

int idx = 16* (tmpColor.getRed()/64) + 4*(tmpColor.getGreen()/64) + (tmpColor.getBlue()/64); 
bin[idx].push(tmpColor); 

Однако это не работает. Как добавить цвет в массив в конкретном индексе?

+3

отклик «кажется, не работает» крайне расплывчатым. Вы получили сообщение об ошибке? Если да, опубликуйте его. Вы получаете исключение? Если вы это сделаете, разместите трассировку стека. Может ли 'idx' превышать 64? В вашем коде есть некоторые ошибки, но я хотел бы помочь вам выследить их, а не просто дать вам ответ. –

+0

max idx is 16 * 3 + 4 * 3 + 3 = 63 - все в порядке. – iced

+0

Это ошибка, которую я получаю'Cannot invoke push (Цвет) для типа массива Color [] 'idx can not превышает 64 – user3540466

ответ

0

Как решить заключается в следующем: вместо того, чтобы создать массив массивов я создал и массив ArrayLists

int size = 64; 
ArrayList<Color>[] lists = new ArrayList[size]; 
for(int i = 0; i < size; i++) { 
    lists[i] = new ArrayList<Color>(); 
} 

После этого я раздвинул элементы их конкретного бункера (в данном случае в списках)

lists[idx].add(tmpColor); 

После получения длину и первый цвет в массиве s следующим образом:

for (ArrayList<Color> p : lists){ 
    System.out.println("size of bin" + p.size()); 
    if (p.isEmpty()) 
     continue; 
    else { 
    System.out.println("list" + p.get(0)); 
    } 
} 
+0

Вот что я бы предложил. Это просто и удовлетворяет всем вашим требованиям. Хорошее решение. – Sky

0

Если вам нужен List цветов для индекса можно использовать Map:

private Map<Integer, List<Color>> bin = new HashMap<Integer, List<Color>>(); 

int idx = 16* (tmpColor.getRed()/64) + 4*(tmpColor.getGreen()/64) + (tmpColor.getBlue()/64); 

if(bin.get(idx)==null) bin.put(idx, new ArrayList<Color>()); 

bin.get(idx).add(tmpColor); //This should be exactly what you need 

Вы также можете использовать различные структуры, как List<List<Color>> или List<Color>[]. Каждая структура реле на List с List может быть обновлена ​​и создана без знания начальной длины.

Что я хотел бы сделать, это создать отдельный класс для цвета бункера и некоторые полезные методы в:

public class Bin{ 

    private List<Color> colors = new ArrayList<Color>(); 

    public void addColor(Color col){ 
     this.colors.add(col); 
    } 

    public List<Color> getColors(){ 
     return this.colors; 
    } 

    public boolean hasColor(Color col){ 
     return colors.contains(col); 
    } 
    //and so on... 
} 

И лучшую структуру для вашей цели сейчас карта с отложенной инициализацией:

private Map<Integer, Bin> myBinsOfColors = new HashMap<Integer, Bin>(); 

int idx = 16* (tmpColor.getRed()/64) + 4*(tmpColor.getGreen()/64) + (tmpColor.getBlue()/64); 

if(myBinsOfColors.get(idx)==null) myBinsOfColors.put(idx, new Bin()); //Lazy 

myBinsOfColors.get(idx).addColor(tmpColor); //This should be exactly what you need 

Для получения информации о количестве и количестве цветов вы можете использовать два метода в классе Bin:

public class Bin{ 

    private List<Color> colors = new ArrayList<Color>(); 

    //As above. 
    public Color calculateAverage() { 
     Integer red = 0; 
     Integer blue = 0; 
     Integer green = 0; 
     if(!colors.isEmpty()) { 
     for (Color col : colors) { 
      red+= col.getRed(); 
      green+= col.getGreen(); 
      blue+= col.getBlue(); 
     } 

     return new Color(red/colors.size(), green/colors.size(), blue/colors.size()); 
     } 
     return null; 
    } 

    public int getColorCount(){ 
     return this.colors.size(); 
    } 

    //and so on... 
} 
+0

У меня есть массив цветов, тогда я хочу классифицировать их в разных ячейках (точнее, 64).После этого я делаю хэш-карту, которая имеет средний цвет каждого бункера и количество цветов в этом бункере. – user3540466

Смежные вопросы