如何基于多个比较器实现add()到排序列表;参数化比较器?

时间:2012-04-24 17:32:50

标签: java insert comparator

我需要实现以下功能。我愿意使用最好的类,但我不确定是否应该使用SortedSet或TreeSet(如Set myEmailsAscending = new TreeSet(new DateAscendingComparator()); //电子邮件总是按升序排列。)

public void addEmail(Email email)//The prototype isn't to be altered.
{
Comparator comp;
if(getCurrentSortingMethod()=="DateDescending") comp=DateDescendingComparator;
else if(getCurrentSortingMethod()=="DateAscending") comp=DateAscendingComparator;
...//other comparators

int index = Collections.binarySearch(getEmails(), email, new comp());// Search where to insert according to the current sorting method.
getEmails().add(-index-1, email);}// Add the item to the list
}

这是选择比较器的正确语法吗? 我想避免创建多个Comparator类,所以有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

有几个问题:

您应该使用equals()进行字符串比较,而不是==

使用new是错误的。我建议如下:

Comparator comp;
if (getCurrentSortingMethod().equals("DateDescending")) {
   comp = new DateDescendingComparator();
} else if (getCurrentSortingMethod().equals("DateAscending")) {
   comp = new DateAscendingComparator();
} ...

int index = Collections.binarySearch(getEmails(), email, comp);

请注意new块中if的移动方式。

作为所有这些的替代方案,您可以使用SortedSet<Email>和适当的比较器。该集将自动按正确的顺序排序。

答案 1 :(得分:0)

在类构造函数中接受Comparator和/或为其提供setter。 然后在addEmail(Email email)内使用比较器。如果没有设置比较器,则使用自然排序。

查看TreeSet以及它如何处理比较器和自然排序。尝试将其调整为您自己的列表实现。