#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() может получить к нему доступ?