示例:一个查询将抛出下一个结果集:
姓名|年龄|总计
我想将这个arraylist分成三个,并将它们存储在一个hashmap中,其中key是客户端名称。
我在想像
这样的东西Arraylist<Row> rows = dao.getClientActivity();
Map map = new HashMap<Clients Name, Clients Row>();
Arraylist<Row> = null;
for (Row row : rows){
if (map.get(row.clientName) == null) list = new ArrayList<Row>();
list.add(row);
if(map.get(row.clientName) == null) map.put(row.clientName, list);
}
列表将始终按名称排序。
把上面的代码片段作为伪代码,我家里没有编码程序,我只是把它放在了我的头顶,我想我在周五测试了类似的东西,但它只打印在行上;
我不知道是否有更好的方法可以做到这一点,但这是我提出的第一件事。
答案 0 :(得分:3)
您的地图声明应如下所示(假设Row.clientName
为String
):
Map<String, List<Row>> map = new HashMap<String, List<Row>>();
for循环应如下所示:
for (Row row : rows){
/*Get the list of rows for current client name.*/
List<Row> currRows = map.get(row.clientName);
if (currRows == null) {/*If not list exists for*/
currRows = new ArrayList<Row>(); /*create a new one*/
map.put(row.clientName, currRows); /*and put it in the map*/
}
currRows.add(row);/*add the current row to the list*/
}
答案 1 :(得分:1)
我假设您无法更改输入格式。
我建议您创建一个代表客户的模型:
public class Client {
private final String name;
private final byte age; //Nobody should be older than 256
private final int total;
/* Construct model */
/* Getters/Functions */
}
我还建议您在Client
中创建一个工厂方法,以便从字符串输入中创建类。
public static Client parseClient(String clientRep){
String[] clientData = clientRep.split(',');
Client newClient = new Client(); //TODO: Name conventionally.
newClient.name = clientData[0];
newClient.age = Byte.valueOf(clientData[1]);
newClient.total = Integer.valueOf(clientData[2]);
return newClient;
}
现在,您可以将这些添加到地图(Map<String, Client>
)。
String clientFromWherever = getWhateverDataFromWherever();
Map<String, Client> clientel = new HashMap<>();
Client addingToMap = Client.parseClient(clientFromWherever);
clientel.put(addingToMap.getName() /* or however the name should be got */, addingToMap);
这应该做得很好。
=====
但是 - 如果您不想使用客户端对象,我建议创建一个Map<String, int[]>
并将该年龄和费用存储在数组中。如果您的费用不超过Short.MAXVALUE
,请使用short[]
。存储大量的arraylists(或任何复杂的集合)只是为了存储少量数据是不必要的。
ArrayList<Row> rows = dao.getClientActivity();
Map<String, int[]> clientelData = new HashMap<>();
for(Row clientRow : rows) {
if (!map.containsKey(clientRow.clientName) {
int[] clientNumericalData = new int[2];
map.put(clientRow.clientName, clientNumericalData);
}
}