Java 为什么这里的大写字母排序不正确?

Java 为什么这里的大写字母排序不正确?,java,sorting,alphabetical,Java,Sorting,Alphabetical,我正在尝试对项目的列表进行排序。以下是未排序的列表,以及当前的排序方式: Unsorted: [Pineapple, pineapple, apple, apricot, Banana, mango, Mango, melon, peach] Sorted: [apple, apricot, Banana, mango, Mango, melon, peach, Pineapple, pineapple] 为什么芒果不放在芒果之前,为什么菠萝放在菠萝之前 这是我的密码: import java

我正在尝试对项目的
列表进行排序。以下是未排序的
列表
,以及当前的排序方式:

Unsorted: [Pineapple, pineapple, apple, apricot, Banana, mango, Mango, melon, peach]
Sorted: [apple, apricot, Banana, mango, Mango, melon, peach, Pineapple, pineapple]
为什么
芒果
不放在
芒果
之前,为什么
菠萝
放在
菠萝
之前

这是我的密码:

import java.util.*;
import java.lang.*;
import java.io.*;

class Test {
    public static void main (String[] args) throws java.lang.Exception {
        List<String> fruits = new ArrayList<String>(7);

        fruits.add("Pineapple");
        fruits.add("pineapple");
        fruits.add("apple");
        fruits.add("apricot");
        fruits.add("Banana");
        fruits.add("mango");
        fruits.add("Mango");
        fruits.add("melon");        
        fruits.add("peach");

        System.out.println("Unsorted: " + fruits);

        Collections.sort(fruits, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {              
                return o1.compareToIgnoreCase(o2);
            }
        });

        System.out.println("Sorted: " + fruits);
    }
}
import java.util.*;
导入java.lang.*;
导入java.io.*;
课堂测试{
公共静态void main(字符串[]args)引发java.lang.Exception{
列表结果=新的ArrayList(7);
水果。加入(“菠萝”);
水果。加入(“菠萝”);
水果。添加(“苹果”);
水果。添加(“杏”);
水果。添加(“香蕉”);
水果。添加(“芒果”);
水果。添加(“芒果”);
水果。添加(“甜瓜”);
水果。添加(“桃子”);
System.out.println(“未分类:+水果);
Collections.sort(水果,新比较器(){
@凌驾
公共整数比较(字符串o1,字符串o2){
返回o1.比较信号(o2);
}
});
System.out.println(“分类:+水果);
}
}

您使用了
compareToIgnoreCase()
作为比较方法,因此它将“菠萝”和“菠萝”比较为0(同一字符串),使它们保持自集合排序时的顺序。排序保证不会对相等的元素重新排序。 换言之,“菠萝”在“菠萝”之前出现,因此,由于忽略不计,“菠萝”将保持在“菠萝”之前

由于未排序的列表在“菠萝”之前有“菠萝”,比较将它们按相同的顺序放入已排序的列表中。这些规则同样适用于“芒果”和“芒果”。您正在寻找的比较方法就是
compareTo()
,它考虑了大写和小写字母

为什么“芒果”不放在“芒果”之前?为什么“菠萝”在“菠萝”之前

根据你的比较仪,“芒果”和“芒果”比较相等。由于是,比较相等的项将按照在原始集合中找到它们的顺序返回(不稳定的排序将以任意顺序返回它们)

如果您希望“芒果”总是在“芒果”之前返回,那么您的比较器需要反映这一点。这意味着“芒果”需要比“芒果”小(但比“苹果”、“杏”、“香蕉”等大)

实现这一点的一种方法是使用以下比较器:

Collections.sort(fruits, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {              
        int ret = o1.compareToIgnoreCase(o2);
        if (ret == 0) {
            ret = o1.compareTo(o2);
        }
        return ret;
    }
});

你做的一切都对

“芒果”应该在“菠萝”之前,在“苹果”之后


但是“菠萝”和“菠萝”是“一样的”。平等。"0". 因为您说的是“ignoreCase”。

Collections.sort
保证是稳定的-比较相等的项目的相对顺序不会因排序而改变。如果要强制执行将大写字母置于小写字母之前的排序,则需要使用不同的比较器来实现该排序,实现该排序的最简单方法可能是使用
java.text.RuleBasedCalator

,因为您使用的是
compareToIgnoreCase
,顾名思义,在比较两个字符串时忽略大小写。因此,mango和mango是相同的,并且以与它们相同的顺序保留(排序是稳定的,例如:equals元素以排序前的顺序保留)


另一方面,您的比较器与相同<代码>compareToIgnoreCase
简化调用该比较器。

因为您使用的是忽略大小写的比较。我已回滚到修订版1,因为修订版2将意外输出显示为所需结果。@admdrew:请您停止编辑问题,使其含义发生明显变化(并使本已混乱的局面变得更糟)@NPE我很抱歉,我最初的编辑确实是错误的。我更改了措辞以反映实际输出与预期输出。这并没有回答OP的问题。我对OP要求的理解是,预期结果是苹果、杏子、香蕉、芒果、芒果、瓜、桃、菠萝、菠萝。这并没有做到这一点,因此这也不是一个问题nswer是错误的,或者我对问题的解释是错误的。你确定吗?据我所知,我们知道未排序的列表是什么。然后使用Collections.sort方法对列表进行排序,但通过忽略大小写覆盖比较函数进行排序。除此之外,Collections.sort是稳定的,因此它保证不会对相等的元素重新排序。因此,预期的结果是不可能的,因为比较函数重载将“Mango”和“Mango”视为相等的元素,因此它们保持与未排序列表相同的顺序。是否可能(当然是顺便说一句)不应影响对问题的解释。;-)
Sorted: [apple, apricot, Banana, Mango, mango, melon, peach, Pineapple, pineapple]