#java
Вопрос:
Для школьного проекта я должен сделать звонок на день рождения на java. В этом приложении вы можете добавлять, удалять и изменять дни рождения людей. Моя идея состояла в том, чтобы создать 3d-массив, который включает в себя 12 месяцев по 31 дню, и список массивов в каждый день, так как неизвестное количество людей может иметь один и тот же день рождения. Я понятия не имею, как я могу хранить несколько имен в день и как хранить строки и int в этом 3d-массиве типа int. Кто-нибудь может мне помочь, пожалуйста?
import java.util.Scanner;
import java.time.Month;
import java.util.ArrayList;
public class verjaardag {
public static void optionChoice() {
System.out.println("1 Verjaardag toevoegen,");
System.out.println("2 Verjaardag verwijderen,");
System.out.println("3 Alle verjaardagen zien");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<String> namen = new ArrayList<>();
int birthday[][] = new int[12][31];
System.out.println("Verjaardagskalender 0.1");
optionChoice();
while (true) {
System.out.println("Kies uit de volgende nummers 1, 2, 3!");
String choice = scanner.nextLine();
if (choice.equals("1")) {
System.out.println("Wie is er jarig?");
String name = scanner.next();
namen.add(name);
System.out.println("Op welke dag?");
int day = scanner.nextInt();
System.out.println("Van welke maand?");
int month = scanner.nextInt();
birthday [month -1] [day -1] = namen;
}
if (choice.equals("2")) {
}
if (choice.equals("3")) {
for (String allList : namen) {
System.out.println(allList);
break;
}
continue;
}
}
}
}
Комментарии:
1. Это лучше решить с помощью классов, которые вам нужно создать.
Ответ №1:
ArrayList<String> namen = new ArrayList<>(); int birthday[][] = new int[12][31];
Подумайте об этом; это просто не имеет смысла. Вам нужен 1 список имен для каждой даты, а не «один список имен для всего приложения». «Вещь», которую вы хотите для каждой даты, — это не «число» ( int
это число), но вам нужен «список имен».
Таким образом, то, что вы ищете, это:
List<String>[][] = new ArrayList<String>[12][31];
за исключением того, что это не компилируется, так как здесь вы сразу сталкиваетесь с проблемой: универсальные модули и массивы плохо работают вместе.
Массивы-это раздражающие конструкции, которые нарушают язык и имеют дерьмовый API. Это нормально — до тех пор, пока вы понимаете, для чего они предназначены: это низкоуровневые конструкции, которые вы используете только при создании, скажем, графического драйвера. Или, хех, код, который дает власть ArrayList
. Особенно когда » тип » массива не является примитивным, вам, вероятно, вообще не следует его использовать.
Вы можете вместо списка месяцев. Затем месяц представляется в виде списка дней, а день-в виде списка имен.
List<List<List<String>>>
это то, что вы тогда получите.
Это становится громоздким и быстрым. Спорно, является ли это правильным типом данных в первую очередь. Возможно , вместо этого вы можете закодировать день: (month -1) * 31 (date - 1)
, это даст вам число между 0 (для 1 января) и 371 для 31 декабря. Теперь вы можете просто использовать List<List<String>>
вместо этого. Или еще лучше, Map<Integer, String>
. Java работает лучше, если вы действительно позволяете системе типов работать на вас. Этот идентификатор даты должен быть классом, чтобы, например , у него была хорошая строка (с таким идентификатором вы можете просто позвонить .getMonth()
, вместо того, чтобы выполнять математику ( (idNum)/31 1
).
Это, возможно, спойлер / ближайшие достопримечательности: уровень java, которого вы еще не достигли.
Вы можете просто использовать for
цикл, чтобы настроить список для инициализации до нужного размера:
List<List<List<String>>> days = new ArrayList<>();
for (int month = 0; month < 12; month ) {
List<List<String>> monthList = new ArrayList<>();
days.add(monthList);
for (int day = 0; day < 31; day ) {
List<String> names = new ArrayList<>();
monthList.add(names);
}
}
Это также создает список для несуществующих дат (например, 31 февраля), но это, похоже, не является реальной проблемой.
Чтобы быть ясным, никогда не делайте этого в «реальном» приложении, такие типы, как List<List<List<String>>>
довольно четкое указание на то, что приложение плохо написано. Это работа для Map<DayOfYear, List<Person>>
или что-то подобное. Вы будете использовать List<List<List<String>>>
только потому, что еще не освоили карты и не создали свои собственные типы. Или, если да, то сделайте Map
это вместо этого 🙂