簡體   English   中英

根據屬性的值,從單個對象列表中重建列表

[英]Rebuilding lists from a single list of objects, based on the value of attributes

我正在迭代某些objectslist (每個對象有兩個屬性message (字符串類型)和messageFrom (長類型)。我想根據messageFrommessage屬性轉移到某個特定列表。因此,所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM