2011-03-10 53 views
0

我通過某些objects(每個對象有兩個屬性message(字符串型)和messageFrom(長型)一個list迭代的值。我想轉移message屬性取決於messageFrom一些具體名單。因此,所有的message具有相同messageFrom必須在同一個列表。所以,到了最後,我應該沒有。對應於所有messageFrom名單。重建列出了從對象的一個​​列表中,基於屬性的

什麼是最好的(性能優化)的方式來實現這一點?

+1

你寫過一些非優化這個版本?它是否證明自己是應用程序中的瓶頸?否則,你可能只是浪費你的時間過早優化?或者,您是否無法正確實施? – 2011-03-10 14:31:12

回答

2

使用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; 
     } 
    } 
} 
+0

我們可以有一個完整的工作示例,以便於進一步references.im無法找出此代碼段的主要方法。 – Deepak 2011-03-10 14:38:48

+0

@Deepak - 查看我的編輯。 – 2011-03-11 06:27:00

+0

謝謝妮可.... !!! – Deepak 2011-03-19 07:17:54

0

我想你可以使用地圖列表的:

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); 
} 
+0

我們可以有一個完整的工作示例,以便於進一步references.im無法找出此代碼段的主要方法。 – Deepak 2011-03-10 14:58:27

+0

能否請你幫忙!!!無法弄清楚這將如何工作。你可以用java程序模擬它 – Deepak 2011-03-10 15:06:37

相關問題