Tôi có Danh sách MyObjects ... MyObject {int id, String name}. Bây giờ tôi muốn chia danh sách thành các danh sách con có giá trị "id" giống nhau, bất kỳ ai cũng có thể đề xuất phương pháp hiệu quả để thực hiện việc này.chia bộ sưu tập java thành các bộ sưu tập phụ dựa trên thuộc tính đối tượng
Trả lời
// create the thing to store the sub lists
Map<Integer, List<MyObject>> subs = new HashMap<Integer, List<MyObject>>();
// iterate through your objects
for(MyObject o : list){
// fetch the list for this object's id
List<MyObject> temp = subs.get(o.getId());
if(temp == null){
// if the list is null we haven't seen an
// object with this id before, so create
// a new list
temp = new ArrayList<MyObject>();
// and add it to the map
subs.put(o.getId(), temp);
}
// whether we got the list from the map
// or made a new one we need to add our
// object.
temp.add(o);
}
Lặp qua các phần tử, kiểm tra giá trị id
của chúng và đặt chúng trong một Hashtable
với id
làm khóa. Đó là O (N), đó là hiệu quả như bạn sẽ nhận được.
Còn giá trị thì sao? –
@Kirk - Điều đó phụ thuộc vào cách OP sẽ sử dụng nó. Với một đối tượng tầm thường như vậy có thể thuận tiện để có 'tên' là giá trị, tuy nhiên trong nhiều trường hợp sẽ có ý nghĩa hơn khi có giá trị là chính đối tượng: nó không phải là câu hỏi bạn có thể trả lời mà không có ngữ cảnh. –
ArrayList<MyObject> list=new ArrayList<MyObject>();
//fill Objects..
HashMap<Integer,ArrayList<MyObject>> hash=new HashMap<Integer,ArrayList<MyObject>>();
for(MyObject elem:list)//iterate the list
{
ArrayList<MyObject> tmp=null; //temporary variable
if((tmp=hash.get(elem.getId()))==null) // check if id already present in map
{
tmp=new ArrayList<MyObject>();
hash.put(elem.getId(),tmp); //if not put a new array list
}
names.add(elem); //if present add the name to arraylist
}
+1, giá trị là một danh sách. –
tên không bao giờ trở thành không null trong giải pháp này trong trường hợp bạn phải thêm một ArrayList mới. –
@Mark: Tôi đã không kiểm tra mã. Cảm ơn bạn đã chỉ ra. – Emil
Sử dụng Guava:
ListMultimap<Integer, MyObject> myObjectsById = Multimaps.index(myObjects,
new Function<MyObject, Integer>() {
public Integer apply(MyObject myObject) {
return myObject.id;
}
});
Hoặc, khi sử dụng Java 8: ListMultimap
Sử dụng JDK 1.8:
List<MyObject> objects= new ArrayList();
Map<Integer, List<MyObject>> obejctMap = new HashMap();
objects.stream().map(MyObject::getId).distinct().forEach(id -> obejctMap .put(id,
objects.stream().filter(object -> id.equals(object.getId())).collect(Collectors.toList())));
Nếu bạn đang sử dụng JDK 1.8, bạn có thể sử dụng một giải pháp thanh lịch như:
Map<Integer, List<MyObject>> myObjectsPerId =
myObjects.stream().collect(Collectors.groupingBy(MyObject::getId));
- 1. C bộ sưu tập # thuộc tính
- 2. Cách sắp xếp bộ sưu tập dựa trên thuộc tính thu thập phụ
- 3. Chia bộ sưu tập thành các phần dựa trên điều kiện với LINQ?
- 4. Bộ sưu tập rác java
- 5. Sắp xếp bộ sưu tập dựa trên một bộ sưu tập khác
- 6. REST - Xóa bộ sưu tập đối tượng
- 7. Sắp xếp một đối tượng bộ sưu tập Java dựa trên một lĩnh vực trong đó
- 8. Java - Tạo một bộ sưu tập đối tượng thân thiện
- 9. Chuyển đổi một bộ sưu tập Java thành một bộ sưu tập Scala
- 10. Bộ sưu tập NHibernate và các đối tượng chuyển động
- 11. Sắp xếp một bộ sưu tập của các đối tượng
- 12. Thực hiện IXmlSerializable trên một đối tượng bộ sưu tập
- 13. Cách sắp xếp kết quả Dữ liệu lõi dựa trên thuộc tính của bộ sưu tập đối tượng liên quan?
- 14. Backbone.js Bộ sưu tập của Bộ sưu tập
- 15. XmlSerialize bộ sưu tập tùy chỉnh với Thuộc tính
- 16. Bộ sưu tập chung được sưu tầm
- 17. C bộ sưu tập # rác với đối tượng tham chiếu
- 18. Bộ sưu tập tiêu chuẩn cho các đối tượng IDisposable
- 19. Bộ sưu tập bản đồ của các đối tượng
- 20. Truy vấn đệ quy trong SPARQL để duyệt bộ sưu tập các bộ sưu tập
- 21. Chung Bộ sưu tập
- 22. java: trả lại bộ sưu tập
- 23. Bộ sưu tập rác
- 24. WPF: Bộ sưu tập liên kết với Bộ sưu tập vào một ListBox với các nhóm
- 25. Bộ sưu tập giống Java trong PHP
- 26. Sắp xếp bộ sưu tập trong bộ sưu tập bằng cách sử dụng LINQ
- 27. LINQ: Tìm kiếm một bộ sưu tập trong một bộ sưu tập cho một đối tượng duy nhất
- 28. tùy serialization các bộ sưu tập java sử dụng xStream
- 29. Bộ sưu tập các loại chung
- 30. Rabl Bộ sưu tập nhiều mẫu
nhờ giải pháp này trông tao nhã với tôi. – james
+1 - để thụt lề mã đúng cách và thêm nhận xét –