Eg.:
{2,3},{1,2},(2,2},{3,1},{2,1} to {1,2},{2,1},{2,2},{2,3},{3,1}
这是我的想法:
对值的第一列进行归并排序。遍历集合以查看第一列中是否有任何重复值。如果有,将它们排队到列表上。
在第二列上对此列表进行归并排序,然后将它们整合到主集合中。虽然似乎可行,但这似乎过于复杂。这应该在 O(NlogN)
中运行,因此如果有人能想到一个更快/相同复杂度的算法,也要发布出来!
谢谢!
Comparator<T>
,通过首先比较第一个字段,然后如果第一个字段相等则继续比较第二个字段来比较您类型的任何两个对象。然后将集合复制到列表中,调用Collections.sort
并将列表和您的比较器传递给它。无需自己实现排序。public class TwoFieldComparator implements Comparator<Foo>
{
public int compare(Foo first, Foo second)
{
// TODO: null checks
int firstComparison = Integer.compare(first.x, second.x);
return firstComparison != 0 ? firstComparison
: Integer.compare(first.y, second.y);
}
}
或者,您可以以同样的方式使您的类实现Comparable<T>
。
正如您在其中一条评论中提到的那样,这是一道面试题。John Skeet的解决方案表明,您不必担心项目中有两个值 - 只需实现正确的比较器即可。
假设您在2011年被问到这个问题,了解您的排序将如何使用是很好的。根据将使用此排序的环境,您可以考虑并行处理(使用多个线程)。这可能会影响您选择的排序算法。