У меня есть массив 2D-строк в java, где я - строки, а j - столбцы.
Я ищу элегантное решение для удаления столбцов в следующем массиве.
String[i][j] data;
Предоставленные столбцы могут быть либо одним столбцом, либо несколькими столбцами, т.е. если удаляемые столбцы (7,8), то все значения данных [i][7] и данных [i][8] должны быть удалены из массив.
Я пробовал различные решения, такие как объявление нового массива и копирование из предыдущего массива, исключая столбцы, но мне интересно, есть ли более элегантное решение, которое я могу использовать. Есть зацепки?
Дасир, согласен. Но в этом случае у меня есть данные, поступающие откуда-то еще, и, к сожалению, в данный момент я ничего не могу с этим поделать. :( @ЭдвардПитерс
Нужно ли хранить данные в виде массива? Если он приходит как один, но будущее данных зависит от вас после этого момента, я бы сказал, что их стоит преобразовать. Если вам нужно вывести измененные данные в том же формате, возможно, стоит преобразовать их в любом случае, а затем преобразовать обратно. Если вам нужно более элегантное решение, возможно, это оно. (Это может быть медленнее, если это большие массивы, но это, вероятно, не то, о чем вам нужно беспокоиться.) Если ArrayList
просто не существует, да, возможно, просто создайте новый массив и скопируйте.
Я пожалел тебя и написал это. Я думаю, что это то, что "элегантно" выглядит в Java?
import java.util.*;
import java.util.stream.*;
class ArrayMangler {
public static void main(String[] args) {
String[] sample1 = {"Adam", "Bob", "Charlie", "Donald"};
String[] sample2 = {"Ernst", "Ferdinand", "Godfrey", "Hrothgar"};
String[] sample3 = {"Iago", "Jormangandr", "Killroy", "Lorelei"};
String[][] input = {sample1, sample2, sample3};
List<Integer> badIndexes = Arrays.asList(1, 3);
String[][] output = removeColumns(input, badIndexes);
for (String[] row : output){
System.out.println(Arrays.toString(row));
}
}
public static String[][] removeColumns(String[][] input, List<Integer> indexesToTrim){
return Arrays.stream(input)
.map(arr -> removeFromRow(arr, indexesToTrim))
.toArray(String[][]::new);
}
public static String[] removeFromRow(String[] input, List<Integer> indexesToTrim){
return IntStream
.range(0,input.length)
.filter(i ->!indexesToTrim.contains(i))
.mapToObj(i -> input[i])
.toArray(String[]::new);
}
}
В общем, если вы собираетесь изменять размер, не используйте массив — используйте
ArrayList
или другой более гибкий тип. (На самом деле, в 90% случаев я бы просто использовал один из них для начала. Массивы - это боль.)