说我有以下清单
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)等)。这应根据传入数据动态完成。
正如您已经说过的那样,如果使用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)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |