[英]Get attributes value from sql database as user defined object in hashmap
public class Dashboard {
int REQUEST_ID, PRICE, PROCESSED;
String LOGIN_USER;
public int getREQUEST_ID() {
return REQUEST_ID;
}
public void setREQUEST_ID(int rEQUEST_ID) {
REQUEST_ID = rEQUEST_ID;
}
//all getters and setters
public class DBConnection {
public ArrayList<Dashboard> getStoreResult() {
ArrayList<Dashboard> dashRec;
try{
Class.forName("");
Connection con=DriverManager.getConnection("");
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("");
HashMap<Object, List<Dashboard>> map = new HashMap<>();
while (rs.next()) {
Integer id = rs.getInt(1);
if (!map.containsKey(id)) {
dashRec= new ArrayList<Dashboard>();
map.put(id, dashRec);
}
Dashboard dash = new Dashboard();
dash.setREQUEST_ID(id);
dash.setLOGIN_USER(rs.getString(2));
dash.setPRICE(rs.getInt(3));
dash.setPROCESSED(rs.getInt(4));
map.get(id).add(dash);
}
}
}
}
我想在上面的 hashmap 中添加用户定义的 object 的名称和状态。 名称必须像前 3 组的 A,接下来的 2 组行的 B 。我要插入的状态必须是相同 ID 的行集中的最小数字。 也就是说,ID 为 123,我们需要将状态 1 作为 object 插入 hashmap 中,对于 id 456,我们需要状态 2。如何完成?
您可以像这样在 while 循环之后循环 map
检查列表大小是否为 3、2 或 1
根据您的帖子查询,有 3、2 和 1 行,我想
当行为 3 时状态从 1 到 3 当行为 2 时状态从 2 到 3 当 1 行时状态 1
基于此,我写了一个条件来检查:
大小列表:3 -> (3-3) +1 = 2
大小列表:2 -> (3-2) +1 = 2
大小列表:1 -> (3-1) +1 = 3
原子整数
因为我在Foreach
中使用Stream
Dashboard list
,并且如果您想访问此方法之外的任何变量,请将其标记为 final。 所以我添加了 AtomicInteger 的 Object
// create another map contains the lowest status for each id
Map<Integer, Integer> lowestStatus = new HashMap<>();
for (Integer key : map.keySet()) {
// get the size of the list related to that id
int size = map.get(key).size();
int status = (3 - size) + 1;
final AtomicInteger statusCounter = new AtomicInteger(status);
if (status != 3) {
map.get(key).forEach(dashboard -> {
if (!lowestStatus.containsKey(key))
lowestStatus.put(key, statusCounter.get());
dashboard.setStatus(statusCounter.getAndIncrement());
});
} else {
Dashboard dashboard = map.get(key).get(0);
dashboard.setStatus(1);
lowestStatus.put(key, 1);
}
}
, 另一个版本
当前状态
必须跟踪该 ID 时的最后状态是什么
最低状态
将第一个匹配项保存到具有给定 id 的给定行集将取 1 个值
Map<Integer, List<Dashboard>> map = new HashMap<>();
Map<Integer, Integer> lowestStatus = new HashMap<>();
Map<Integer, Integer> currentStatus = new HashMap<>();
while (rs.next()) {
Integer id = rs.getInt(1);
if (!map.containsKey(id)) {
map.put(id, new ArrayList<Dashboard>());
currentStatus.put(id, 0);
lowestStatus.put(id, 1);
}
Dashboard dash = new Dashboard();
dash.setRequestId(id);
dash.setLoginUser(rs.getString(2));
dash.setPrice(rs.getInt(3));
dash.setProcessed(rs.getInt(4));
dash.setStatus(currentStatus.get(id) + 1);
currentStatus.put(id, currentStatus.get(id) + 1); // update the status for the next iteration
map.get(id).add(dash);
}
如果我清楚地理解了您的要求,您想按requestId
的升序对Map
进行排序,然后按status
的升序对具有相同requestId
的Dashboard
记录列表进行排序。 如果是这样,下面给出的是相同的解决方案:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
class Dashboard {
private int requestId, price, processed;
String loginUser;
public Dashboard(int requestId, String loginUser, int price, int processed) {
this.requestId = requestId;
this.price = price;
this.processed = processed;
this.loginUser = loginUser;
}
public int getRequestId() {
return requestId;
}
public int getPrice() {
return price;
}
public int getProcessed() {
return processed;
}
public String getLoginUser() {
return loginUser;
}
@Override
public String toString() {
return requestId + "\t" + price + "\t" + processed + "\t" + loginUser;
}
}
public class Main {
public static void main(String[] args) {
Map<Object, List<Dashboard>> map = new TreeMap<>();
List<Dashboard> list;
list = new ArrayList<Dashboard>();
list.add(new Dashboard(456, "B", 25, 2));
list.add(new Dashboard(456, "B", 20, 3));
map.put(456, list);
list = new ArrayList<Dashboard>();
list.add(new Dashboard(123, "A", 10, 2));
list.add(new Dashboard(123, "A", 15, 3));
list.add(new Dashboard(123, "A", 5, 1));
map.put(123, list);
list = new ArrayList<Dashboard>();
list.add(new Dashboard(789, "C", 30, 1));
map.put(789, list);
// Sort the list of Dashboard records with the same requestId in ascending order
// of status
for (Entry<Object, List<Dashboard>> entry : map.entrySet()) {
Collections.sort(entry.getValue(), Comparator.comparing(Dashboard::getProcessed));
}
// Display Result
System.out.println("reqid\tname\tprice\tstatus");
for (List<Dashboard> recordList : map.values()) {
for (Dashboard record : recordList) {
System.out.println(record.getRequestId() + "\t" + record.getLoginUser() + "\t" + record.getPrice()
+ "\t" + record.getProcessed());
}
}
}
}
Output:
reqid name price status
123 A 5 1
123 A 10 2
123 A 15 3
456 B 25 2
456 B 20 3
789 C 30 1
笔记:
int requestId
,我们不需要做任何事情来比较它们。 TreeSet
会自动将它们按升序排列。status
的升序对具有相同requestId
的Dashboard
记录列表进行排序,我使用requestId
作为键获得了Dashboard
记录列表,然后使用Comparator.comparing(Dashboard::getProcessed)
对List
进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.