2010-11-10 50 views
5

Tôi có một HashMap<Object, Student> trong đó Object là ID của Sinh viên và Sinh viên là đối tượng của Sinh viên.Đặt hàng HashMap theo thứ tự bảng chữ cái theo giá trị

Tôi làm cách nào để có thể sử dụng HashMap theo tên Sinh viên, student->getName()?

+0

Nó phụ thuộc những gì các bài tập về nhà " muốn "bạn làm. Vì không có "sử dụng", có lẽ nó muốn bạn hiển thị/xuất khẩu các sinh viên (trong HashMap) theo một thứ tự cụ thể ...dù sao đi nữa, bài tập về nhà thì thay đổi theo cách đó. –

+1

Ngắt của http://stackoverflow.com/questions/1894081/what-is-the-easiest-way-to-sort-maps-according-to-values-in-java, http://stackoverflow.com/questions/2839003/sorting-in-hash-maps-in-java và có lẽ nhiều hơn thế nữa. – BalusC

+2

Đây phải là một trong 10 câu hỏi Java hàng đầu. –

Trả lời

13

HashMaps thực chất không có thứ tự và không thể sắp xếp được.

Thay vào đó, bạn có thể sử dụng triển khai SortedMap, chẳng hạn như TreeMap.
Tuy nhiên, ngay cả một bản đồ được sắp xếp chỉ có thể sắp xếp theo các phím của nó.

Nếu bạn muốn sắp xếp theo các giá trị, bạn sẽ cần sao chép chúng vào danh sách được sắp xếp.

0

HashMaps không thể sắp xếp theo giá trị của chúng. Bản đồ được thiết kế để tra cứu thời gian liên tục dựa trên khóa, vì vậy việc đặt hàng theo giá trị không cần thiết. Nếu bạn cần sắp xếp theo tên, tôi khuyên bạn nên sử dụng một số SortedSet và tạo trình so sánh sắp xếp theo tên.

class StudentComparator implements Comparator<Student> { 
    int compare(Student s1, Student s2) { 
     return s1.getName().compareTo(s2.getName()); 
    } 
} 

Nếu bạn cần tra cứu liên tục và sắp xếp theo giá trị, bạn có thể cần duy trì bản đồ và tập hợp.

+0

Trừ khi chúng là 'null'. – SLaks

+0

vâng, tôi đã giả định rằng một học sinh sẽ luôn có một tên –

+1

Và rằng bản thân học sinh không phải là vô giá trị. – SLaks

1

Không thể sắp xếp bản đồ theo giá trị. Tuy nhiên, bạn có thể thực hiện việc này:

Collection<Student> students = map.values(); 

Collection.sort(new ArrayList<Student>(students)), new Comparator<Student>() { 
    public int compare(Student s1, Student s2) { 
     return s1.getName().compareTo(s2.getName()); 
    } 
}); 

Giả sử, tất nhiên, bạn cần phải lặp lại các giá trị. (Tại sao bạn lại muốn nó ra lệnh như thế?)

Chúc may mắn.

+0

TreeMaps được đặt hàng. Nói rằng Maps nói chung không thể không hoàn toàn chính xác. Có, tôi biết OP nói để sử dụng một HashMap, nhưng bạn nói Bản đồ, không phải HashMap. –

+1

Đặt hàng bằng các phím. Tôi nói theo thứ tự các giá trị, không phải chìa khóa. – Todd

0

Tôi chắc chắn sẽ sử dụng Lớp mới sẽ lưu trữ khóa và Đối tượng. Sau đó, bạn có thể đặt mọi phần tử của Bản đồ vào một ArrayList dưới dạng lớp này, và cuối cùng sử dụng một bộ so sánh để sắp xếp ArrayList, sau đó bạn chỉ cần xây dựng một Bản đồ mới. Mã sẽ được một cái gì đó như thế này:

Map<Object, Student> valueMap = new LinkedHashMap<String, String>(); 
List<Student> pairValueList = new ArrayList<PairValue>(); 

PairValue p; 
for (Map.Entry<Object, Student> entry : map.entrySet()) { 
    Object key = entry.getKey(); 
    Student value = entry.getValue();   
    p = new PairValue(key, value); 
    pairValueList.add(p); 
} 

Collections.sort(pairValueList, new Comparator<PairValue>() { 
    @Override 
    public int compare(PairValue c1, PairValue c2) { 
    return c1.getLabel().compareTo(c2.getLabel()); 
    } 
}); 

for (PairValue pv : pairValueList) { 
    valueMap.put(pv.getValue(), pv.getStudent()); 
} 

Các PairValue lớp

class PairValue {  

    private Object value;  
    private Student student; 

    public PairValue(Object value, String student) { 
    this.value = value; 
    this.student= student; 
    } 

    public String getValue() { 
    return value; 
    } 

    public String getStudent() { 
    return student; 
    }  
} 

Thats cách tôi giải quyết một số vấn đề tương tự tôi đã có trong quá khứ. Xin lưu ý rằng việc thực hiện bản đồ trả về cần phải là LinkedHashMap.

4

Bạn có thể không sắp xếp được HashMap, nhưng bạn chắc chắn có thể làm điều gì đó cung cấp hiệu ứng tương tự. Tôi đã có thể sắp xếp chuỗi HashMap < của mình, Số nguyên > bằng giá trị giảm dần của Số nguyên bằng cách sử dụng mã tuyệt vời được đăng tại blog Javarevisited. Nguyên tắc tương tự sẽ được áp dụng cho một HashMap < String, String > đối tượng:

/* 
* Java method to sort Map in Java by value e.g. HashMap or Hashtable 
* throw NullPointerException if Map contains null values 
* It also sort values even if they are duplicates 
*/ 
public static <K extends Comparable,V extends Comparable> Map<K,V> sortByValues(Map<K,V> map){ 
    List<Map.Entry<K,V>> entries = new LinkedList<Map.Entry<K,V>>(map.entrySet()); 

    Collections.sort(entries, new Comparator<Map.Entry<K,V>>() { 

     @Override 
     public int compare(Entry<K, V> o1, Entry<K, V> o2) { 
      return o1.getValue().compareTo(o2.getValue()); 
      // to compare alphabetically case insensitive return this instead 
      // o1.getValue().toString().compareToIgnoreCase(o2.getValue().toString()); 
     } 
    }); 

    //LinkedHashMap will keep the keys in the order they are inserted 
    //which is currently sorted on natural ordering 
    Map<K,V> sortedMap = new LinkedHashMap<K,V>(); 

    for(Map.Entry<K,V> entry: entries){ 
     sortedMap.put(entry.getKey(), entry.getValue()); 
    } 

    return sortedMap; 
} 

Để gọi phương pháp này, tôi sử dụng:

Map<String, Integer> sorted = sortByValues(myOriginalHashMapObject); 

Read more: http://javarevisited.blogspot.com/2012/12/how-to-sort-hashmap-java-by-key-and-value.html#ixzz2akXStsGj

Các vấn đề liên quan