Сохранение данных из 2D-массива в массив

#java #arrays #multidimensional-array

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

Вопрос:

Прежде всего, я сохраняю данные в 2D-массив, и код работает нормально. Код показан следующим образом,

   for(int a = 0; a < bitmap1.getWidth(); a  ){
      // ------ This is X
                        for(int b = 0; b < bitmap1.getHeight()-1; b  ){
                            // ---------- This is Y
                            intArray1[a][b] = Integer.toHexString(bitmap1.getPixel(a,b));
                            intArray2[a][b] = Integer.toHexString(bitmap2.getPixel(a,b));
                            intArray3[a][b] = Integer.toHexString(bitmap3.getPixel(a,b));
                            intArray4[a][b] = Integer.toHexString(bitmap4.getPixel(a,b));
                            intArray5[a][b] = Integer.toHexString(bitmap5.getPixel(a,b));
                            intArray6[a][b] = Integer.toHexString(bitmap6.getPixel(a,b));
                            intArray7[a][b] = Integer.toHexString(bitmap7.getPixel(a,b));
                            intArray8[a][b] = Integer.toHexString(bitmap8.getPixel(a,b));
                        }
                    }//end of Nested FOR
  

Затем я использую nested for loops для изменения данных из arrays , как указано выше. Однако это только 1st array из моего 8 array . Есть ли какой-либо другой способ сократить количество дублирующегося кода вместо копирования того же кода, как показано ниже, и выполнить преобразование из 1st array в 8 array ?

     int [][] arrayOneZero = new int [array1.length][array1.length];
    for(int a = 0; a < array1.length; a  ){
        for(int b = 0; b < array1.length-1; b  ){
            if(array1[a][b].equals("ffffffff")){
                //This is White
                arrayOneZero[a][b] = 1;
            }else if(array1[a][b].equals("ff000000")){
                //This is Black
                arrayOneZero[a][b] = 0;
            }else if(array1[a][b].equals("00000000")){
                //THis is Black
                arrayOneZero[a][b] = 0;
            }
        }
  

После этого я хочу получить данные из метода, и результатом будет все 0, поскольку я почти уверен, что результатом будет 1 или 0. Но я не знаю, как записать данные из 2D-массива в массив, поскольку приведенный ниже код определенно неверен.

  int [][] arrayReturned1 = getArrayText(intArray1);
 int [] colorValue = new int[bitmap1.getWidth()*bitmap1.getHeight()];
      for(int a = 0; a < bitmap1.getWidth(); a  ) {
            for(int b = 0; b < bitmap1.getHeight()-1; b  ) {
                   arrayReturned1[a][b] = colorValue[a];
             }
      }
  

Вопрос отредактирован, но проблема по-прежнему остается.

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

1. arrayReturned1[a][b] = colorValue[a]; — ты не это имеешь в виду colorValue[index] = arrayReturned1[a][b]; ? Обратите внимание, что я использовал index здесь, потому что я предполагаю, что вы хотите преобразовать 2D-массив в одномерный массив. В этом случае длина массива была бы width * height и index либо была бы a * height или b * width в зависимости от того, хотите ли вы, чтобы данные хранились по столбцам или по строкам (что было бы более распространенным способом).

2. Также обратите внимание, что в getArrayText() единственном условии, которое имеет какой-либо эффект, было бы array1[a][b].equals("ffffffff") (кстати, я бы использовал equalsIgnoreCase(...) ) — все остальные ничего бы не сделали, потому что элементы массива уже инициализированы в 0. Кроме того, ваши комментарии немного вводят в заблуждение — обычно 1 представляет белый, а 0 черный (и ffffffff будет представлять белый с полной непрозрачностью, в то время как ff000000 может представлять черный с полной непрозрачностью при использовании ARGB или красный с нулевой непрозрачностью при использовании RGBA).

3. @Thomas поскольку я получаю массив из метода, например, arrayReturned1[0][0] значение равно 1, то я хочу, чтобы значение 1 добавлялось в массив colorValue[0] . Что-то вроде этого, и это переходит во вложенные циклы, поскольку arrayReturned1[a][b] это 2D-массив..

4. @Thomas кстати, спасибо за ответ.. для ARGB #ffffffff представляет черный, а черный равен 1. Я здесь ошибаюсь?

5. Как я уже сказал, если вы хотите «добавить» значение arrayReturned1[0][0] в colorValue , вам нужно вызвать colorValue[0] = arrayReturned1[0][0]; . Я также не уверен, что вы поняли или согласны с другой частью моего первого комментария: если arrayReturned1 имеет размеры 5x3 , у вас есть 15 элементов (5 внутренних массивов по 3 элемента в каждом), поэтому colorValue длина, вероятно, должна быть 15, а не 5, как в вашем коде ( int [] colorValue = new int[bitmap1.getWidth()]; ).

Ответ №1:

Что ж, я нахожу себе решение, в котором я использую arrayList для хранения данных. И это работает нормально.

  ArrayList<String>arrayList = new ArrayList<>();
                    for(int a = 0; a < bitmap1.getWidth(); a  ){
                        for(int b = 0; b < bitmap1.getHeight(); b  ){
                            String a1 = String.valueOf(arrayInput1[a][b]);
                            String a2 = String.valueOf(arrayInput2[a][b]);
                            String a3 = String.valueOf(arrayInput3[a][b]);
                            String a4 = String.valueOf(arrayInput4[a][b]);
                            String a5 = String.valueOf(arrayInput5[a][b]);
                            String a6 = String.valueOf(arrayInput6[a][b]);
                            String a7 = String.valueOf(arrayInput7[a][b]);
                            String a8 = String.valueOf(arrayInput8[a][b]);
                            arrayList.add(a1 a2 a3 a4 a5 a6 a7 a8); // Store 1110001 into ArrayList
                        }
                    }
  

Надеюсь, это может помочь кому-то еще.