Поиск определенной части в строковом массиве с использованием определенного ключевого слова Java

#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]