按相反顺序对Set进行排序

时间:2014-03-06 00:28:05

标签: java

为新手问题道歉,但是以正确的方式获得Set(说LinkedHashSet)的顺序是什么?对于Collection,有Collections.reverse(Collection c),但是对于具有有序元素的Set(如LinkedHashSet),如何做到这一点?

5 个答案:

答案 0 :(得分:14)

一般不对集合进行排序,因此为了保留排序,在将集合排序为列表之后,您需要使用Set的已知迭代顺序实现,例如LinkedHashSet

List list = new ArrayList(set);
Collections.sort(list, Collections.reverseOrder());
Set resultSet = new LinkedHashSet(list);

您也可以将TreeSet与比较器一起使用,但这并不像上面的ArrayList方法那么快。

答案 1 :(得分:1)

public class LargestArray {
public static void main(String[] args) {

    ArrayList<Integer> al = new ArrayList<>();
    Set<Integer> set = new TreeSet<>();
    set.add(10);
    set.add(20);
    set.add(7);
    set.add(4);
    set.add(1);
    set.add(2);
    set.add(3);
    set.add(4);
    System.out.println("after Sorting");
    for(int i : set) {
        System.out.print("  " + i);
    }
    al.addAll(set);
    set.clear();
    Collections.reverse(al);
    System.out.println();
    System.out.println("After Reverse");
    for (int i : al) {
        System.out.print(" " + i);
    }

}

}
  

输出=排序后     1 2 3 4 7 10 20   反转后    20 10 7 4 3 2 1

答案 2 :(得分:0)

检查出来

http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html#descendingSet()

如果您使用TreeSet,则可以通过调用descendingSet来获得相反的顺序。

答案 3 :(得分:0)

我将以一个例子向您解释。在代码中间添加了注释,以便更好地理解。

public class ReverseLinkedHashSet {

    public static void main(String[] args) {

        // creating a LinkedHashSet object which is
        // of type String or any. Will take a example of String.
        HashSet<String> cars = new LinkedHashSet<String>();

        // adding car elements to LinkedHashSet object as below
        cars.add("Toyato");
        cars.add("Hundai");
        cars.add("Porshe");
        cars.add("BMW");

        // Iterating using enhanced for-loop to see the order.
        System.out.println("Insertion Order: Iterating LinkedHashSet\n");
        for(String car : cars) {
            System.out.println(car);

        // Output will be as below  
        //Toyato
        //Hundai
        //Porshe
        //BMW
        }

        // Now convert to ArrayList to rearrange to reverse
        // the linkedHashset
        List<String> listOfCars = new ArrayList<String>(cars);

        // to reverse LinkedHashSet contents
        Collections.reverse(listOfCars);

        // reverse order of LinkedHashSet contents
        // can be done as below
        System.out.println("\n\n\nReverse Order of LinkedHashSet\n");
        for(String car : listOfCars) {
            System.out.println(car);

        // Output will be as below  
        //BMW
        //Porshe
        //Hundai
        //Toyato    
        }
    }
}

此外,我建议不要在没有充分理由的情况下使用LinkedhashSet。对于复杂的应用程序,它会降低性能。请改用HashSet

答案 4 :(得分:0)

Java 8,我在下面使用解决方案,

Set<String> setTest = new HashSet<>();

setTest.add("1");
setTest.add("2");
setTest.add("3");

List<String> list = new ArrayList<>(setTest);
list.sort(Collections.reverseOrder());
Set<String> result = new LinkedHashSet<>(list);

for (String item: result) {
    System.out.println("---> " + item);
}

Result:

---> 3
---> 2
---> 1

为我工作。