#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
Комментарии:
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