Как сохранить входные данные сканера и сопоставить их с массивом? Затем выберите случайный элемент из этого массива

#java #arrays #random #methods #constructor

#java #массивы #Случайный #методы #конструктор

Вопрос:

Работаю над проектом Java для начинающих.

Идея программы состоит в том, чтобы выбрать любимый жанр пользователя и вернуть случайную рекомендацию, основанную на топ-10 (начиная с 3 сейчас) список книг в каждом жанре.

Мой главный вопрос заключается в том, как я могу принять их входные данные, привести их в соответствие с правильным массивом и распечатать случайный элемент из этого массива в методе getRecommendation() .

Приведенный ниже код (без учета импорта и общедоступного класса):

 public WhatBook() {
    
    System.out.println("Hello, what genre of book are you in the mood for?");
        System.out.println("Please enter: n1 for Horrorn2 for Adventuren3 for Crimen4 for Warn5 for Scifi");
        while (true) {
        Scanner scanGenre = new Scanner(System.in);
        int bookGenre = scanGenre.nextInt();
        
        if (bookGenre < 1 || bookGenre > 5) {
            System.out.println("Please choose from the genres from 1 to 5.");
        } else {
            System.out.println(bookGenre   "? Great choice! Let's get some recommendations for you.");
            break;
        }
        
    }


public static String getRecommendation() {

    // pick random element of the entered genre array
    // create random object
    int rnd = new Random().nextInt(array.length);
    return array(rnd);

}

// public arrays
String[] horror = { "The Shining", "The Stand", "The Haunting of Hill House" };
String[] adventure = { "Into Thin Air", "Hatchet", "The Call of the Wild" };
String[] crime = { "In Cold Blood", "Devil in the White City", "Helter Skelter" };
String[] war = { "The Things They Carried", "All Quiet on the Western Front", "Catch-22" };
String[] scifi = { "Dune", "1984", "Ender's Game" };

public static void main(String[] args) {

    WhatBook user1 = new WhatBook();

}
  

Я попытался использовать цикл переключения в конструкторе, чтобы присвоить каждому значению int соответствующий массив. Нравится:

переключатель (книжный жанр) {

случай 1: bookGenre = horror[0]; перерыв; и т.д…

но это не работает.

Есть идеи, как сохранить значение bookGenre int в соответствии с его массивом?

Ответ №1:

Я бы создал массив или массивы (2D-массив) из ваших существующих книжных массивов:

 String[][] genres = { horror, adventure, crime, war, scifi };
  

Просто убедитесь, что они перечислены в том же порядке, что и ваша система меню. Поскольку ваше меню начинается с 1, нам придется вычесть 1 из пользовательского выбора, чтобы сделать нуль на основе массива.

Затем я бы изменил ваш getRecommendation() метод для получения массива. Кроме того, я бы объявил статический экземпляр Random , который можно использовать снова и снова, вместо того, чтобы каждый раз создавать новый:

 private static Random R = new Random();

public static String getRecommendation(String[] array) {
    // pick random element of the entered genre array
    // create random object
    int rnd = R.nextInt(array.length);
    return array[rnd];
}
  

Наконец, просто убедитесь, что введенное пользователем число находится в пределах вашего массива, и передайте соответствующий массив методу:

 int bookGenre = scanGenre.nextInt();
if (bookGenre >=1 amp;amp; bookGenre <= genres.length) { // between 1 and genres.length to match the displayed menu
  System.out.println(bookGenre   "? Great choice! Let's get some recommendations.");
  String book = getRecommendation(genres[bookGenre - 1]); // subtract 1 to make it zero based
  System.out.println("Your recommendation: "   book);
}
else
{
  System.out.println("Invalid Choice.");
}
  

Вот все это вместе взятое:

 import java.util.Random;
import java.util.Scanner;
public class WhatBook {

  private static Random R = new Random();

  // public arrays
  String[] horror = { "The Shining", "The Stand", "The Haunting of Hill House" };
  String[] adventure = { "Into Thin Air", "Hatchet", "The Call of the Wild" };
  String[] crime = { "In Cold Blood", "Devil in the White City", "Helter Skelter" };
  String[] war = { "The Things They Carried", "All Quiet on the Western Front", "Catch-22" };
  String[] scifi = { "Dune", "1984", "Ender's Game" };
  
  String[][] genres = { horror, adventure, crime, war, scifi };

  public WhatBook() {
      System.out.println("Hello, what genre of book are you in the mood for?");
      System.out.println("Please enter: n1 for Horrorn2 for Adventuren3 for Crimen4 for Warn5 for Scifin");
      Scanner scanGenre = new Scanner(System.in);
      System.out.print("Your choice: ");
      int bookGenre = scanGenre.nextInt();
      if (bookGenre >=1 amp;amp; bookGenre <= genres.length) {
        System.out.println(bookGenre   "? Great choice! Let's get some recommendations.");
        String book = getRecommendation(genres[bookGenre - 1]);
        System.out.println("Your recommendation: "   book);
      }
      else
      {
        System.out.println("Invalid Choice.");
      }
  }

  public static String getRecommendation(String[] array) {
      // pick random element of the entered genre array
      // create random object
      int rnd = R.nextInt(array.length);
      return array[rnd];
  }

}
  

Комментарии:

1. Более продвинутым решением было бы использовать карту с жанром в качестве ключа и строковый массив в качестве значения.

Ответ №2:

вы ищете концепцию поля.

Комментарии:

1. Хорошо, спасибо. Попытаюсь обдумать, каким может быть ответ.

2. Если я сделаю bookGenre общедоступным полем, я двигаюсь в правильном направлении? Значит, метод getRecommendation() может получить к нему доступ?