Объединение 2D-массива с 1D-массивом

#java #arrays #multidimensional-array

#java #массивы #многомерный-массив

Вопрос:

У меня есть 2 массива, один из которых — a int[][] pixelYArray , а другой — a int[] pixelXArray . Я не могу установить полную ширину и высоту изображения в качестве длины, потому что эти пиксели уже отфильтрованы. Например, цвет желтый, а это оставшиеся пиксели, и я хочу создать массив или объект, подобный этому:

  [
  {
    "pixel x" : 1,
    "pixel y" : [
      1, 2, 3, 100, 101, 102
    ]
  },{
    "pixel x" : 3,
    "pixel y" : [
      1, 2, 32, 100, 101, 102
    ]
  },
]
  

текст "pixel x" и "pixel y" являются необязательными и не нужны, если это упрощает создание массива. В Javascript вы можете достичь этого, выполнив что-то вроде этого

 let array = [];
for(int i=0;i < pixelYArray.length;i  ){
    let tmpArr = [];
    for(int j=0;j < pixelYArray[i].length; j  ){
        tmpArr.push(pixelYArray[i][j]);
    }
    array.push({
        "pixel x" : pixelXArray[i],
        "pixel y" : tmpArr
    });
    /* or
    array.push({
        pixelXArray[i],
        tmpArr
    }); */
}
  

только как вы можете достичь этого в Java, потому что вы не можете создавать подобные объекты или помещать их в массив. У меня есть цикл for, подобный этому:

    for(int i=0;i < pixelYArray.length;i  ){
        System.out.println("pixel x: "   pixelXArray[i]   " pixel y: ");
        for(int j=0;j < pixelYArray[i].length; j  ){
            System.out.print(pixelYArray[i][j]   "t" );
        }
        System.out.println("nEnd of Pixels for row n");
    }
  

что дает такой результат и еще много слоев X пикселей и y пикселей ofc строки из X и Y пикселей n в результате цикла

Комментарии:

1. вместо этого вы бы использовали списки, там вы можете добавлять материал динамически. если вы настаиваете на массивах, вам нужно создать новый для каждого push , добавить дополнительный элемент и скопировать содержимое предыдущего состояния. Я сделал это здесь , в prepend методах, но это громоздко.

2. Обратите внимание, что массивы в Java должны иметь свою длину, определенную при их создании, поэтому вы можете List<List<Integer>> вместо этого использовать a (т.Е. список списков целых чисел). Если вы создаете класс, например FilteredLine , который содержит список пикселей и этот "pixel x" value, it would become a список <FilteredLine>` и FilteredLine будет содержать List<Ineger> .

3. На самом деле я оба меняю их на массивы, потому что раньше был список, так что тогда лучше сделать из этих 2 отдельных списков 1 список вместо преобразования, а затем пытаться их объединить?

4. Я думаю, вам решать, что вас больше раздражает. Я полагаю, у вас были свои причины выбрасывать списки и вместо этого использовать массивы.

5. Да, но я чувствую, что преобразование списка в массив в список — это просто плохая практика, не так ли? не лучше ли вместо этого преобразовать его в список в объединенный список в массив?

Ответ №1:

Я думаю, это решит вашу проблему:

 public class Test {
    public static void main(String[] args) {
        List<Color> list = new ArrayList<>();
        Color c = new Color();
        c.pixel_x = 1;
        c.pixel_y.add(1);
        c.pixel_y.add(2);
        c.pixel_y.add(3);
        c.pixel_y.add(100);
        c.pixel_y.add(101);
        c.pixel_y.add(102);

        list.add(c);

        System.out.println(c);
    }
}
  
 class Color {
    public int pixel_x;
    public List<Integer> pixel_y;

    public Color() {
        pixel_x = 0;
        pixel_y = new ArrayList<>();
    }

    @Override
    public String toString() {
        return pixel_x   " "   pixel_y;
    }
}
  

Сначала вы создаете Color объект, который содержит pixel_x тип Integer и pixel_y тип List<Integer> , затем в вашем основном, каждый раз, когда вы создаете Color экземпляр, добавляете его List<Color> .

Комментарии:

1. Это работает, но для каждого нового X-пикселя вам нужно создать новый цветной объект, верно? разве это не будет проблемой с производительностью, если у вас много X пикселей и / или изображений

2. в вашем случае работа с array на java невозможна, потому что, в отличие от javascript, длина массива в java должна быть известна при компиляции, и лучшим решением является использование коллекций, таких как List