2011-07-28 156 views
2

如何根据元素值对列表进行排序?基于元素值的排序列表

在我的单元测试类,我收到列表,它是有序的形式根据其元素的值{sortOrder and it has value 1, 2 and 3}我现在用expectedList比较returnedList做出的一个确保两个列表是相同的,在相同的顺序相同的元素。我回

例和预期列表:

expected List = [Code: ANALYST, SortOrder: 2, Code: STREET, SortOrder: 1]

returned List = [Code: STREET, SortOrder: 1, Code: ANALYST, SortOrder: 2]

所以,我怎样才能在SortOrder的列表,以便我的期望列表变成排序:

expected List = [Code: STREET, SortOrder: 1, Code: ANALYST, SortOrder: 2]

我不能使用任何库,这个问题与Compare List Question,有什么建议吗?

+0

为什么它“你不能使用库”?这听起来不太可能,除非这是“家庭作业”,在这种情况下,标记为“家庭作业”。我用“使用Hamcrest”回答了[你的其他非常类似的问题](http://stackoverflow.com/questions/6852117/how-to-compare-two-list-based-on-elements-it-contains),它也适用于此。 – Bohemian

+0

@Bohemian:我们使用spring框架并通过spring和junit进行单元测试,我们不应该使用任何外部库 – Rachel

回答

7

使用这样的:

public static void sort(List list, Comparator c) 

所以做这样的事情:

Collections.sort(myList, myComparator) 

myComparator是一个接口,而您只需要实现一个方法,这是比较:

public int compare(Object o1, Object o2) 

所以你可以用一个匿名的内部类来做到这一点:

Collections.sort(myList, new Comparator<MyType>(){ 
    public int compare(MyType o1, MyType o2) { 
     //My implementation 
    } 
}); 

有关如何实现比较方法看看文档在这里:

Comparator

+0

我正在做单元测试,所以我不知道如何在junit测试类中实现'myComparator' – Rachel

+0

正在执行单元测试的比较器不是过度杀伤 – Rachel

+0

@Rachel不,如果你实现它作为一个匿名内部类像在我的例子:) –

0

如果你不介意修改返回的列表,你有两个选择:

  • 如果你可以修改对象(即你有一个清单),实现可比和覆盖的compareTo(为MyObject)方法。

  • 如果不能修改的对象,然后创建一个比较,并把它传递给你的排序方法。

如果不能修改的列表,做这样的事情:

List<MyObject> newList = new ArrayList<MyObject>(); 
newList.addAll(reterunedList); 
newList.removeAll(expectedList); 
// check here (newList.size() > 0 ?) 
expectedList.removeAll(returnedList); 
// check here (expectedList.size() > 0 ?) 

如果有什么留在名单中的任何两项检查就意味着你的列表是不同的。而且你还没有修改你的返回列表。它需要你的MyObject正确地实现了equals()方法。

+0

你可以提供一个例子,我也不能修改列表 – Rachel

+0

我给你一个示例代码。有关第一部分的例子,请阅读奥斯卡的回复。 – n0rm1e

+0

*“我也无法修改列表”* - 将其复制并对副本进行排序。 –