什么是基于一个列数据对ArrayList()进行群集的更干净的方法?

Sus*_*ant 1 java arraylist

说我有以下清单

 full_list

 ID     NAME
 1      Apple
 1      Banana
 2      Carrot
 1      Mango
 2      Spinach
 3      BMW
 3      Opal
Run Code Online (Sandbox Code Playgroud)

有了这个列表,我想根据ID如下所示的列创建分组列表

 fruits_list              veggies_list               cars_list
 ID      NAME             ID      NAME              ID     NAME
 1       Apple            2       Carrot            3      BMW
 1       Banana           2       Spinach           3      Opal
 1       Mango
Run Code Online (Sandbox Code Playgroud)

我正在尝试用Arraylist<ArrayList<CustomObject>>。但这增加了代码的复杂性。我做错了吗?有没有更清洁的方法可以做到这一点?

PS:数据输入不固定。我无法明确定义带有条件的列表(即if(id == 1),if(id == 2)等)。这应根据传入数据动态完成。

Moh*_*har 5

正如您已经说过的那样,如果使用List进行操作将更加复杂。可以通过使用Map and List简化此逻辑。使用Map and List实现此目的的示例代码如下

Map<Integer, List<String>> myMap = new LinkedHashMap<Integer, List<String>>();
try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/stackoverflow?useSSL=false",
            "root", "password");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("select * from `58144029`");
    while (rs.next()) {
        List<String> myList = myMap.get(rs.getInt("id")) == null ? new LinkedList<String>()
                : myMap.get(rs.getInt("id"));
        myList.add(rs.getString("name"));
        myMap.put(rs.getInt("id"), myList);
    }
    con.close();
} catch (Exception e) {
    e.printStackTrace();
}
System.out.println(myMap);
// Getting the List as per id
System.out.println(myMap.get(1));
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我已经在数据库中创建了与您相同的表。现在,数据会动态添加到地图中。无论您在数据库中拥有的id是什么,都将成为映射的键,而该id的值将成为值列表。键可以是任何整数,您可以将它们进一步映射到特定列表。

查询创建表并插入数据如下

CREATE TABLE `58144029` (
  `id` int(11) NOT NULL,
  `name` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `58144029` (`id`, `name`) VALUES
(1, 'Apple'),
(1, 'Banana'),
(2, 'Carrot'),
(1, 'Mango'),
(2, 'Spinach'),
(3, 'BMW'),
(3, 'Opal');
Run Code Online (Sandbox Code Playgroud)