我将如何在 Java 中创建一个 2D ArrayList?

How would I go about creating a 2D ArrayList in Java?

我正在使用 java 创建一个基本的 SQL 编辑器,我想知道如何创建一个二维数组,将每个 'Persons' 数据存储在一个数组列表中。我有一个名为 contactdetails 的数据库,它存储每个人的联系 ID、全名、电子邮件、phone 号码等,我只是想看看是否有人可以在评论中留下一些代码来告诉我如何解决这个问题?这是我用来从数据库中检索的当前代码:

public void SELECTALL() {
    db.Connnect();
    Connection conn = db.getConnection();
    if (conn!=null) {
        try {
            String SQL = "SELECT * FROM (?);";
            PreparedStatement stmt = conn.prepareStatement(SQL);
            //Gathering which table the user wants to view
            Scanner s = new Scanner(System.in);
            System.out.println("Enter name of table");
            String TABLENAME = s.nextLine();
            //Inserting table name into SQL command
            stmt.setString(0, TABLENAME);
            //Executing query
            ResultSet rs = stmt.executeQuery();
            //Displating data to user
            while (rs.next()) {
                //DATA GETS STORED IN 2D ARRAY SO EACH PERSON GETS OWN PERSONAL INTEGER TO BE CALLED BY E.G soandso.get(4) 
            }
        } catch (SQLException err) {
            System.err.println(err);
        }
            
    }
}

谢谢大家。任何反馈也会很好。

列表和人物 class

我肯定会建议创建一个 Person class 来存储与一个人的一个实例相关的所有数据。此 class 将包括此人的联系 ID、全名、电子邮件、phone 号码等。像这样的东西会起作用,尽管您希望将这些字段设为私有并设为 getters/setters最终对他们来说:

public class Person {
    public int id;
    public String name;
    public String email;
    public String phoneNumber;
}

然后,在抓取结果时,您可以创建 Person class 的新实例并将所有人员详细信息存储在那里。然后,您可以将所有 Person 个实例存储在 List<Person> 中,如下所示:

public void SELECTALL() {
    List<Person> persons = new ArrayList<Person>();
    ...

    while (rs.next()) {
        Person person = new Person();
        person.id = rs.getInt("idColumn");
        person.name = rs.getString("nameColumn");
        ...

        persons.add(person);
    }
}

然后你可以 return 整个 List<Person> 最后,如果你愿意的话。要在填写 List<Person> 后获得特定的 Person 实例,您可以使用 Streams 过滤该列表,如下所示:

Person john = persons.stream()
                     .filter(person -> person.name.equals("John"))
                     .findFirst()
                     .orElse(null);

这将在您的人员列表中获得第一个 Person 实例,其名称完全等于“John”。如果没有人使用该名称,它将 return 改为 null。

二维数组列表

但是如果你真的坚持使用2D ArrayList,你可以这样做:

public void SELECTALL() {
    List<List<String>> persons = new ArrayList<List<String>>();
    ...

    while (rs.next()) {
        List<String> personData = new ArrayList<String>();
        personData.add(rs.getString("idColumn"));
        personData.add(rs.getString("nameColumn"));
        ...

        persons.add(personData);
    }
}

HashMap

但是,如果您要这样做,我建议您尝试 HashMap 并将此人 ID 设置为 HashMap 的“关键”,如下所示:

public void SELECTALL() {
    Map<Integer, List<String>> persons = new HashMap<Integer, List<String>>();
    ...

    while (rs.next()) {
        List<String> personData = new ArrayList<String>();
        int key = rs.getInt("idColumn");
        personData.add(rs.getString("nameColumn"));
        ...

        persons.put(key, personData);
    }
}

然后就可以得到List<String>的人物数据了:

List<String> person = persons.get(key);