2010-05-11 91 views
2

我在HashMap中拥有一组书对象。这本书有book_title,book_author,book_year_published等。我想根据book_title(它是一个String)按升序和降序对它们进行排序,并将它们显示在屏幕上。基于对象的变量对HashMap中对象的集合进行排序

我希望有人能帮助我 - 我已经这样做了几个小时,仍然没有拿出一个解决方案。提前致谢。

+0

您需要指定书籍是键还是地图中的值。 – 2010-05-11 07:31:17

+0

请记住接受(最好)帮助您解决问题的答案。 (使用答案左侧的绿色复选标记。) – Jonik 2010-05-14 12:09:45

回答

2

使用TreeMap使用自定义Comparator

sortedMap = new TreeMap (bookTitleComparator); 
sortedMap.putAll(bookMap); 

向你HashMap的排序版本。

要颠倒顺序,使用

revComparator = Collections.reverseOrder (bookTitleComparator); 

(见the docs

+1

没有这样的构造函数;请参阅http://java.sun.com/javase/6/docs/api/java/util/TreeMap.html – 2010-05-11 07:32:42

+1

+1,以了解“使用具有自定义比较器的TreeMap”的一般概念。 (花时间修复破碎的示例代码) – Jonik 2010-05-11 07:47:43

4

既然你只是想给本本排序,概念上存在没有必要使用一个映射为目标数据结构。 A SortedSet或甚至List似乎是更适合的类型。这里是一个骨架溶液:

class Book { 
    public String getTitle() { 
     .... 
    } 
    ... 
} 

class AscendingTitle implements Comparator<Book> { 
    public int compare(Book b1, Book b2) { 
     return b1.getTitle().compareTo(b2.getTitle()); 
    } 
} 

... 
SortedSet<Book> orderedBooks = new TreeSet<Book>(new AscendingTitle()); 
orderedBooks.addAll(hashMap.valueSet()); // or hashMap.keySet(); 
... 

排序以不同的顺序(例如,由书名降序),定义替代比较器类和填充不同TreeSet中。 (如果你正在排序一个非常大的书籍散列图,使用ArrayList和快速排序而不是TreeSet和树插入排序可能更有效,但对于任何足够小的书集,您可能会考虑在屏幕上显示它,排序效率不是一个问题。)

+0

+1,可能比使用TreeMap更有用(我只是在阅读完整*问题后才意识到:P) – Jonik 2010-05-11 08:05:29

+0

感谢您的帮助,但我仍然没有得到哪部分代码决定结果是上升还是下降? – 2010-05-11 08:14:19

+0

“compareTo”位。你可以交换参数,以另一种方式进行排序。 – 2010-05-11 08:25:24