【问题标题】:Adding element to array of array将元素添加到数组数组
【发布时间】:2015-05-11 23:24:28
【问题描述】:

我有一个带有颜色变量的数组

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

之后我想在这个数组中插入颜色 我遍历颜色列表,而 tmpColor 是循环中的特定颜色。我需要将它插入到它所属的特定循环中。

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

但是这似乎不起作用。如何在特定索引的数组中添加颜色?

【问题讨论】:

  • 响应“似乎不起作用”非常模糊。你有错误吗?如果你这样做,请发布它。你有例外吗?如果这样做,请发布堆栈跟踪。 idx 可以超过 64 吗?您的代码中有一些错误,但我想帮助您找出它们,而不是仅仅给您答案。
  • 最大 idx 为 16 * 3 + 4 * 3 + 3 = 63 - 这里一切正常。
  • 这是我得到的错误“无法在数组类型 Color[] 上调用 push(Color)” idx 不能超过 64
  • 为什么你认为有#push 方法可以向数组中添加一些东西?这是 Java 而不是 JavaScript。如果你想添加一些东西,请使用bin[index] = arrayOfColorToAdd;。请注意tmpColor 不是数组,不能添加到bin[index]。
  • @user3540466 您是否只是在计算一个数字并希望将其存储在数组中,或者是否有一些后续值可能存储在数组的第一个维度中,这将使用二维数组。

标签: java arrays multidimensional-array colors


【解决方案1】:

如果您的索引需要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&lt;List&lt;Color&gt;&gt; 或 List&lt;Color&gt;[]。每个结构都依赖于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...
}

【讨论】:

  • 我拥有的是一组颜色,然后我想将它们分类在不同的 bin 中(准确地说是 64)。然后我会制作一个哈希图,其中包含每个 bin 的平均颜色以及该 bin 中有多少颜色的计数。
【解决方案2】:

我的解决方法如下:而不是创建我创建的数组数组和 ArrayLists 数组

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

之后我将元素推送到它们的特定 bin(在本例中为列表)

lists[idx].add(tmpColor);

然后得到数组中的长度和第一个颜色如下:

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));
    }
}

【讨论】:

  • 这也是我的建议。它很简单,可以满足您的所有要求。很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多