我通過某些objects
(每個對象有兩個屬性message
(字符串型)和messageFrom
(長型)一個list
迭代的值。我想轉移message
屬性取決於messageFrom
一些具體名單。因此,所有的message
具有相同messageFrom
必須在同一個列表。所以,到了最後,我應該沒有。對應於所有messageFrom
名單。重建列出了從對象的一個列表中,基於屬性的
什麼是最好的(性能優化)的方式來實現這一點?
我通過某些objects
(每個對象有兩個屬性message
(字符串型)和messageFrom
(長型)一個list
迭代的值。我想轉移message
屬性取決於messageFrom
一些具體名單。因此,所有的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);
}
現在你有一張地圖將每個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);
}
你寫過一些非優化這個版本?它是否證明自己是應用程序中的瓶頸?否則,你可能只是浪費你的時間過早優化?或者,您是否無法正確實施? – 2011-03-10 14:31:12