Способ поиска по матрице имен, печатает только 1-ю строку - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь создать метод, который ищет двумерный массив, содержащий имена людей. Например, вы вводите определенную букву, и она должна передать все имена, соответствующие ей, в 1d массив и распечатать его. Затем пользователь выбирает имя из списка совпадений и печатает информацию об имени, такую ​​как возраст, пол, DOB. Сначала я создал небольшую матрицу для тестирования, и она работала нормально, но после того, как я добавил больше имен и информации, она перестала работать. Теперь он просто печатает информацию для имени в матрице.

Пример того, как он должен работать (когда у меня была маленькая тестовая матрица):

Note: search is case sensitive.
Search: L
[null, Lee, null]
Enter the name of your match: Lee

Name: Lee
Sex: M
DOB: 4/4/1993
Height: 5’5”

Search again?
1 to search, 0 to exit

Как это работает сейчас:

Note: search is case sensitive.
Search: J
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
Enter the name of your match: 
Name: Adam  
Sex: M
DOB: (blank)
Height: 5’5”

Search again?
1 to search, 0 to exit

Обратите внимание, что информация Адама распечатана, хотя я еще не ввел информацию о матче. Плюс, массив 1D не находит совпадений, хотя есть несколько имен, начинающихся с A. Также предполагается, что картинка с текстом отображается, игнорируйте этот код. Вот мой код:

 public static void main(String[] args)
  {
    String[][] matrix =

    {
      //has much more data, but it looks like this:
      {"Adam","M", "", "5’5”"}, 
      {"Adonis", "M", "", "5’0”"}, 
      {"Aeruna", "F", "", "5’4”"}, 
      {"Aja", "F", "", "5’2”"}}
        };
    int i = -1;
    while (i != 0) // sentinel value
    {
      Scanner input = new Scanner(System.in);
      System.out.println("Note: search is case sensitive.");
      System.out.print("Search: ");
      String search = input.next();

      retrieveByName(search, matrix);

      System.out.print("Enter the name of your match: ");
      String name = input.nextLine();
      int k = positionFinder(name, matrix);

      printInfo(k, matrix);

      System.out.println("\nSearch again?\n1 to search, 0 to exit");
      i = input.nextInt();
      if (i == 0)
        System.exit(0);

    }

  }

  public static int positionFinder(String name, String[][] matrix)
  {
    int pos = 0;

    for (int idx = 0; idx < matrix.length; idx++)
    {

      if (name.equals(matrix[idx][0]))
        pos = idx;

    }

    return pos;
  }

  public static void retrieveByName(String str, String[][] matrix)
  {

    String[] matches = new String[matrix.length];
    for (int k = 0; k < matrix[0].length - 1; k++)
    {
      if ((matrix[k][0]).contains(str))
      {

        matches[k] = matrix[k][0];
      }
    }

    System.out.println(Arrays.toString(matches));

  }

  public static void printInfo(int k, String matrix[][])
  {
    String[] images = {"Untitled_Artwork 9.png", "Untitled_Artwork 9.png"};
    JFrame frame = new JFrame();
    ImageIcon icon = new ImageIcon((images[k]));

    JLabel label = new JLabel(icon);
    int width = icon.getIconWidth();
    int height = icon.getIconHeight();
    icon =
      new ImageIcon(icon.getImage().getScaledInstance(width / 2, height / 2,
        Image.SCALE_DEFAULT));
    label = new JLabel(icon);
    frame.add(label);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

    System.out.print("\n");
    System.out.println("Name: " + matrix[k][0]);
    System.out.println("Sex: " + matrix[k][1]);
    System.out.println("DOB: " + matrix[k][2]);
    System.out.println("Height: " + matrix[k][3]);


  }
}

1 Ответ

0 голосов
/ 29 января 2020

Просто замените String search = input.next(); на String search = input.nextLine();

Проблема в том, что если вы используете просто next(), то символ перевода строки (/ n) все еще буферизируется, после чего вы звоните на String name = input.nextLine(); и возвращаемая строка является пустой строкой. Начиная с name = "", каждое имя в вашей матрице содержит "". Вот почему вы получаете Адама, первым из которых найден поиск.

При переходе от next() к nextLine() ваши переменные будут назначены правильно.

-

Я настоятельно рекомендую вам использовать IDE и научиться отлаживать код. Используя некоторые точки останова, вы легко можете найти эти ошибки.

...