#java #arrays #string
Вопрос:
Я пытаюсь создать метод, который будет принимать строку (имя), проходить через этот массив и сохранять только эту конкретную строку. Я не могу изменить способ хранения этой информации, так как на этом устройстве основано много кода.
Я хотел бы вставить «майк», и он удалит все остальные части массива и вернет мне эту единственную строку.
private static final String[][] MsgKeys = { {"mike", "75", "up"}, {"john", "15", "up"}, {"eric", null, "left"}, {"mark", null, "right"}, {"chris", "87", "up"}, {"shawn", null, "left"}, {"blake", "67", "left"}, {"bentley", null, "right"} }
Комментарии:
1. Вам действительно следует рассмотреть возможность использования списка/массива классов, а не 2d-списка строк
2. Массивы имеют фиксированную длину. Таким образом, вы не можете удалять элементы, а только устанавливать для них значение null.
3. Кроме того, есть разница в «найти» и «изменить структуру данных», что звучит так, как будто вы хотите это сделать
Ответ №1:
Я не думаю, что удалять что-либо-хорошая идея. В частности, массивы имеют фиксированный размер, поэтому вам нужно будет либо изменить его на список, либо создать совершенно новый массив.
Поскольку вы не определили поведение нескольких строк с одинаковым именем, как насчет возврата только первой совпадающей строки или null, если она не найдена?
private String[] getRow(String name, String[][] data) { for (String[] row : data) { if (data[0].equals(name)) return row; } return null; }
Ответ №2:
Вы не можете полностью удалить элементы из массива, поскольку он имеет фиксированную длину. Что вы можете сделать, так это вернуть второй 1d массив.
private String[] getLineByName(String name){ String[] ret; for(int i = 0; i lt; MsgKeys.length; i ){ if(MsgKeys[i][0].equals(name)){ ret = MsgKeys[i]; return ret; } } return null; }
Ответ №3:
Как упоминалось в других ответах , вы не должны удалять элементы из array
, но вы можете найти строку, используя stream
:
public static String[] findRow(String name, String[]... array) { return Arrays.stream(array) .filter(row -gt; Objects.equals(row[0], name)) .findAny().orElse(null); }
Тогда вы можете сделать:
String[] row = findRow("mike", MsgKeys); System.out.println(Arrays.toString(row));
Выход:
[mike, 75, up]