Collections.sort不会对任何内容进行排序



我正在尝试以简短,简单的方式对字符串数组进行排序。我正在尝试使用Collections.sort,但我不明白为什么它不对任何内容进行排序。法典:

public static String[] FishNamesSorted;
.....
List<String> nameslist = new ArrayList<String>();
nameslist.toArray(FishNamesSorted);
Collections.sort(nameslist, String.CASE_INSENSITIVE_ORDER); <--- NOT WORKING
Collections.sort(nameslist, new Comparator<String>() { <--- NOT WORKING
    @Override
    public int compare(String p1, String p2) {
    if (p1 == null) {
        return 1;
    }
    if (p2 == null) {
        return -1;
    }
    return p1.compareToIgnoreCase(p2);
    }
});

两种情况下的结果:

  • 波西莉亚·拉蒂皮娜
  • 网纹苜蓿
  • 诺特罗皮斯·克罗索莫斯
  • 假木苣苔科
  • ....

为什么?

Collections.sort(list)绝对有效。代码中的问题是您在排序之前将列表放入数组中。如果在将列表放入数组之前先对列表进行排序,则应对数组进行排序

List<String> nameslist = new ArrayList<String>();
/* add elements to namesList */
Collections.sort(nameslist);
Object[] fishNamesSorted = nameslist.toArray();

解决方案是

Arrays.sort(FishNamesSorted, String.CASE_INSENSITIVE_ORDER)

我误解了它的工作原理

你应该在排序后才将nameslist放入FishNamesSorted数组中,而你现在没有这样做。

看一看,

    String[] FishNamesSorted;
    // creating and initializing list,
    List<String> nameslist = new ArrayList<String>();
    // Adding some data in your list
    nameslist.add("Poecilia Latipinna");
    nameslist.add("Poecilia Reticulata");
    nameslist.add("Notropis Chrosomus");
    nameslist.add("Pseudomugil Gertrudae");
    // sorting your list,
    Collections.sort(nameslist);
    // print sorted list
    for (String s : nameslist){
        System.out.println(s);
    }
    System.out.println("===================");
    // convert the sorted list to an array and assign it 
    // a String array.
    FishNamesSorted = nameslist.toArray((new String[nameslist.size()]));
    // print your String array,
    for (String s : FishNamesSorted){
        System.out.println(s);
    }

仅供参考,如果您使用的是 Java 8,您可以使您的排序过程运行得更快。

Java 8提供了一个API来使用Arrays.parallelSort(type)对任何类型的数组进行排序,它执行排序的方式与Collection.sort相同,但具有并行实现。

Java 集合提供的当前排序实现 框架>(Collections.sortArrays.sort)都执行排序 在调用线程中按顺序操作。此增强功能将 提供当前由 数组类,但具有利用 分叉/联接框架。这些新的 API 在方面仍然是同步的 到调用线程,因为它不会通过排序 操作,直到并行排序完成。

要实现它,请将上述代码中的Collections.sort替换为Arrays.parallelSort

取代

Collections.sort(nameslist);

Arrays.parallelSort(nameslist.toArray(new String[nameslist.size()]));

相关内容

最新更新