[英]Rebuilding lists from a single list of objects, based on the value of attributes
我正在迭代某些objects
的list
(每個對象有兩個屬性message
(字符串類型)和messageFrom
(長類型)。我想根據messageFrom
將message
屬性轉移到某個特定列表。因此,所有message
具有相同的messageFrom
必須在同一個列表中。所以,最后,我應該沒有與所有messageFrom
相對應的列表。
實現這一目標的最佳(性能優化)方法是什么?
使用HashMap
。
Map<Long, ArrayList<String>> data = new HashMap<Long, ArrayList<String>>();
// where T is the type of your object
for (T t : list) {
if (!data.containsKey(t.messageFrom)) {
data.put(t.messageFrom, new ArrayList<String>());
}
data.get(t.messageFrom).add(t.message);
}
現在您有一個Map,它將每個messageFrom
映射到它的消息列表。
編輯
這是一個完整的工作示例:
public class ListSplitter {
public static void main(String... args) {
// let's build up the original list
List<MyObject> oList = new ArrayList<MyObject>();
for (int i = 0; i < 10; i++) {
oList.add(new MyObject((long) i, "Hello"));
oList.add(new MyObject((long) i, "World"));
}
// now oList contains 20 items:
// 2 messages ("Hello" and "World") for each messageFrom field
// now let's split them up
Map<Long, ArrayList<String>> data = new HashMap<Long, ArrayList<String>>();
for (MyObject m : oList) {
if (!data.containsKey(m.messageFrom)) {
data.put(m.messageFrom, new ArrayList<String>());
}
data.get(m.messageFrom).add(m.message);
}
// now you have a map that looks like this:
//
// [0] -> "Hello" : "World"
// [1] -> "Hello" : "World"
// ...
// you can now print out the values as such:
for (Entry<Long, ArrayList<String>> tuple : data.entrySet()) {
System.out.println("Messages from " + tuple.getKey());
for (String msg : tuple.getValue()) {
System.out.println(" -> " + msg);
}
System.out.println();
}
}
private static class MyObject implements Comparable<MyObject> {
public long messageFrom;
public String message;
public MyObject(long from, String msg) {
messageFrom = from;
message = msg;
}
@Override
public int compareTo(MyObject m) {
if (messageFrom == m.messageFrom) {
return message.compareTo(m.message);
} else {
return messageFrom - m.messageFrom;
}
}
@Override
public boolean equals(Object o) {
if (!(o instanceof MyObject)) {
return false;
} else {
return messageFrom == m.messageFrom
&& message.equals(m.message);
}
}
@Override
public int hashCode() {
return messageFrom;
}
}
}
我想你可以使用列表地圖:
Map<Long,List<String>> map = new HashMap<Long,List<String>>();
for (MyObject obj: myList) {
List<String> list = map.get(obj.messageFrom);
if (list == null) {
list = new ArrayList<String>();
map.put(obj.messageFrom, list);
}
list.add(obj.message);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.