Как разместить несколько строковых переменных в одной координате 3d-массива?

#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 это вместо этого 🙂