2012-11-23 116 views
5

Tôi có một số List<String>List<Integer>. Cả hai đều theo thứ tự cụ thể (chúng được liên kết). List<String> chứa tên và List<Integer> giá trị của chúng.Sắp xếp danh sách theo giá trị

Có cách nào để sắp xếp List<Integer> theo kích thước nhưng cũng thay đổi thứ tự của List<String> sao cho các giá trị và tên vẫn được liên kết?

Trả lời

14

Bạn nên sử dụng List<NameAndValue> thay vì hai danh sách (và tìm tên tốt hơn NameAndValue, phản ánh những dữ liệu này thực sự đại diện). Java là một ngôn ngữ OO. Sử dụng các đối tượng. Đó là những gì họ đang cho: chứa dữ liệu có liên quan, và cung cấp hành vi với các phương pháp và đóng gói.

Khi bạn có lớp học này, bạn sẽ có thể sắp xếp danh sách theo tên, giá trị hoặc cả hai và thêm trường bổ sung nếu cần thiết sẽ không thành vấn đề.

+0

Oh gosh, tôi thoght tôi là người đầu tiên với cách tiếp cận đó ... – ppeterka

+0

downvoter: chăm sóc để giải thích bỏ phiếu xuống của bạn? –

+0

Wow, downvote không thích hợp nhất bao giờ hết? – ppeterka

15

Bạn cần java.util.TreeMap<Integer,String>. Điều này được sắp xếp theo thứ tự tự nhiên của các khóa của nó hoặc theo số Comparator được cung cấp tại thời điểm tạo bản đồ, tùy thuộc vào việc sử dụng constructor.

+1

+1 nó là không khôn ngoan để lưu trữ dữ liệu thuộc về nhau ở những nơi khác nhau ... Hoặc xác định một lớp cho điều này, hoặc ít nhất là đặt nó vào một bản đồ ppeterka

+2

Ai đó có thể vui lòng cung cấp ví dụ – pedja

+2

[ở đây] (http://bit.ly/WFel56) là một điều tốt. – jlordo

2

- Bạn có thể sử dụng java.util.TreeMap<Integer, String> để triển khai SortedMap. Nó sắp xếp theo thứ tự thứ tự tự nhiên của khóa.

- Bạn cũng có thể sử dụng java.util.Comparator<T> để sắp xếp.

1

Từ một sạch góc độ đang, nếu những thuộc về nhau, và cấu trúc này có thể tái sử dụng ở một nơi khác, bạn nên tạo một lớp ra trong số họ, và làm cho nó thực hiện tương đương:

public SomeClass implements Comparable<SomeClass> { 

    private Integer id; 
    private String name; 

    private Whatever elseIsNeededHere; 

    /* getters'n'setters*/ 

    // ******** THOU SHALT NEVER FORGET THY FRIENDS, EQUALS AND HASHCODE, OR ELSE THEY TURN TO BE THY FOES ******** 
    @Override 
    public boolean equals(Object other) { //do what it takes } 

    @Override 
    public int hashCode() { //do what it takes! } 

    /* actually implement Comparable */ 
    @Override 
    public int compareTo(SomeClass o) { 
     //null check, and other bloat left out for sake of brevity 
     return this.id.compareTo(o.getId()); 
    } 

}

Sau đó, bạn có thể có một danh sách duy nhất có chứa những gì thuộc về nhau, và sắp xếp nó thực sự độc đáo:

ArrayList<SomeClass> myList = getMyData(); 
Collections.sort(myList); 

và thể hiện danh sách myList được sắp xếp theo cách bạn muốn.

Nếu bạn muốn phương pháp comparation khác nhau, bạn có thể sử dụng theo cách khác, bằng cách sử dụng Comparators:

Collections.sort(myList,new Comparator<SomeClass>() { 
    public int compare(SomeClass a, SomeClass b) { // do what it takes } 
    }); 
0

Bạn có thể thử này:

Tạo một lớp tùy chỉnh mạch so sánh như:

import java.util.Comparator; 

/** 
* Created by Maddy Sharma on 7/17/2015. 
* Contains sorting logic to sort Dialogs by its date(long) 
*/ 
public class DateDialogComparator implements Comparator<UserChatDialog>{ 

// lhs.getLastMessageDateSent() is the long value 

    @Override 
    public int compare(UserChatDialog lhs, UserChatDialog rhs) { 
    // This line will work in java 7 and Android API Level 19 
    // return Long.compare(lhs.getLastMessageDateSent(), rhs.getLastMessageDateSent()); 


           'OR' 


     if(lhs.getLastMessageDateSent()>rhs.getLastMessageDateSent()) 
      return -1; 
     else if(lhs.getLastMessageDateSent()<rhs.getLastMessageDateSent()) 
      return +1; 
     return 0; 
    } 
} 

gọi từ hoạt động hoặc đoạn như:

ArrayList<UserChatDialog> myList = userChatDialogList; 
Collections.sort(myList, new DateDialogComparator()); 
Log.i("List after sorting is:", "" + userChatDialogList); 
Các vấn đề liên quan