#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 столбца.