Отфильтровывание массива

#java #arrays

#java #массивы

Вопрос:

У меня есть один логический массив [true,false,false,true,true], и я хочу разделить 2d-массив, используя его. то, что я пытался сделать, это

 public static void sorting(boolean[] test, String[][] arr)
   {
       int counter = 0;
       //finds how many people passed
       for(int z = 0; z < arr.length; z  )
       {
           if (test[z] != false)
               counter  ;
               
       }
       String[][] passed = new String[counter][2];
       //tests for which people had Passed and copies it over
       for(int x = 0; x < passed.length; x  )
       {
           for(int y = 0; y < passed[x].length; y  )
           if(arr[x] != false)
               passed[x][y] = arr[x][y];
       }
       example2dArrayPrint(passed);
   }
 

вход, который у меня был бы, это

 Bob A
Fred F
Larry F
John C
Tom B
 

и на выходе было бы

 Bob A
John C
Tom B
 

Я не понимаю, почему это не будет правильно отсортировано.
Редактировать

связь между 2 массивами такова: если test[0] == true, эта часть arr[0][0] и arr[0][1] будет помещена в новый переданный массив, false будет пропущен.
ПРАВКА2

Изменено с 3 на 2, была ошибка при создании этого.

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

1. Пожалуйста, опишите отношения между параметром test и параметром arr

2. отредактировано, чтобы показать связь между тестом и arr @YorkChen

3. Вопрос все еще не ясен, объясните вкратце, почему переданный имеет 3 столбца, должно быть 2, не так ли?

4. Исправлена ошибка @DevParzival,

5. @WJS Я хочу отсортировать строки с F в нем.

Ответ №1:

Вы должны сохранить два разных указателя — один для текущей позиции в passed массиве, а другой во входных arr данных. Попробуйте это:

 public static void sorting(boolean[] test, String[][] arr) {
    int counter = 0;
    //finds how many people passed
    for (int z = 0; z < arr.length; z  ) {
        if (test[z])
            counter  ;

    }
    String[][] passed = new String[counter][2];
    int i = 0;
    //tests for which people had Passed and copies it over
    for (int x = 0; x < arr.length; x  ) {
        if (test[x]) {
            for (int y = 0; y < 2; y  ) {
                passed[i][y] = arr[x][y];
            }
            i  ;
        }
    }

    example2dArrayPrint(passed);
}
 

Выводит:

 [[Bob, A], [John, C], [Tom, B]]
 

Ответ №2:

Вот другой подход с использованием потоков. Я переименовал метод в фильтрацию, поскольку это то, что вы делаете, а не сортировка.

 String[][] data = { { "Bob", "A" }, { "Fred", "F" },
        { "Larry", "F" }, { "John", "C" }, { "Tom", "B" } };

boolean[] test = { true, false, false, true, true };

String[][] result = filtering(test, data);
for (String[] a : result) {
    System.out.println(Arrays.toString(a));
}
 

С принтами

 [Bob, A]
[John, C]
[Tom, B]
 
  • Поток массива целых чисел от 0 до 4 включительно, используя длину массива test массива.
  • затем отфильтруйте эти индексы по логическому значению в тестовом массиве.
  • сопоставьте массив, связанный с каждым индексом, и верните массивы.
 public static String[][] filtering(boolean[] test,
        String[][] arr) {
    return IntStream.range(0, test.length).filter(i -> test[i])
                .mapToObj(i -> arr[i]).toArray(String[][]::new);
}
 

Ответ №3:

 public static void sorting(boolean[] test, String[][] arr){
       int counter = 0;
       //finds how many people passed
       for(int z = 0; z < arr.length; z  ){
           if (test[z])
               counter  ;
       }
       //cols represents number of columns you have in your 2d matrix.
       int cols=2;
       String[][] passed = new String[counter][2];
       counter=0;
       //out loop for iterating over arr
       for(int i=0;i<arr.length;i  )
            if(test[i]){
                //for all cols
                for(int j=0;j<cols;j  ){
                    passed[counter][j]=arr[i][j];
                }
                counter  ;
            }
       example2dArrayPrint(passed);
}
 

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

1. Просмотр предоставленного вами вывода выглядит так, как будто требуется 2 столбца.