Java 为什么我的排序循环似乎在不应该添加元素的地方附加了一个元素';T

Java 为什么我的排序循环似乎在不应该添加元素的地方附加了一个元素';T,java,arrays,sorting,Java,Arrays,Sorting,我正在尝试使用compareTo()对字符串数组进行排序。这是我的代码: static String Array[] = {" Hello ", " This ", "is ", "Sorting ", "Example"}; String temp; public static void main(String[] args) { for (int j=0; j<Array.length;j++) { for (int i=j+1 ; i<Array.

我正在尝试使用
compareTo()
对字符串数组进行排序。这是我的代码:

static String Array[] = {" Hello ", " This ", "is ", "Sorting ", "Example"};
String temp;

public static void main(String[] args)
{

   for (int j=0; j<Array.length;j++)
   {
       for (int i=j+1 ; i<Array.length; i++)
       {
           if (Array[i].compareTo(Array[j])<0)
           {
               String temp = Array[j];
               Array[j] = Array[i];
               Array[i] = temp;
           }
       }
       System.out.print(Array[j]);
   }
}
我正在得到结果,但不是我想要得到的结果,这是:

Hello这个例子是排序

如何调整代码以正确排序字符串数组?

您的输出是正确的。表示开头的白色字符“Hello”和“This”

另一个问题是你的方法。使用
Arrays.sort()
方法:

String[] strings = { " Hello ", " This ", "Is ", "Sorting ", "Example" };
Arrays.sort(strings);
输出:

 Hello
 This
Example
Is
Sorting
public static void main(String[] args) {
    String[] strings = { "x", "a", "c", "b", "y" };
    Arrays.parallelSort(strings);
    System.out.println(Arrays.toString(strings));   // [a, b, c, x, y]
}
在这里,数组的第三个元素“is”应该是“is”,否则它将在排序后排在最后。因为排序方法在内部使用ASCII值对元素进行排序。

而不是此行

if(Array[i].compareTo(Array[j])<0)
if(Array[i].trim().compareTo(Array[j].trim())<0)

if(Array[i].compareTo(Array[j])除了这里发布的备选解决方案(它们是正确的),实际上没有人通过解决代码的问题来回答您的问题

似乎您正在尝试实现一个算法。我将不在这里详细介绍排序的工作原理,但我提供了一些链接供您参考=)

您的代码在语法上是正确的,但在逻辑上是错误的。您只是通过将每个字符串与后面的字符串进行比较来对字符串进行部分排序。下面是一个更正的版本(我保留了尽可能多的原始代码来说明它的“错误”:

静态字符串数组[]={“Hello”、“This”、“is”、“Sorting”、“Example”};
字符串温度;
//跟踪最小字符串的索引
int最短字符串索引;
公共静态void main(字符串[]args)
{              
//我将上限从Array.length减少到(Array.length-1)
对于(int j=0;j
“Hello”、“This”、“is”、“Sorting”、“Example”

首先,您在
“Hello”
“This”
中提供了空格,空格的值低于Unicode中的字母字符,因此它首先被打印出来(其余字符按字母顺序排序)

现在,在Unicode中,大写字母的值比小写字母的值低,因此“示例”和“排序”会被打印出来,最后
“是”
,它的值最高。

如果使用:

if (Array[i].compareToIgnoreCase(Array[j]) < 0)

我想这就是你想要的结果。

我知道这是一个迟到的回复,但也许它可以帮助别人

可以使用trim()函数删除空白。 之后,如果要以区分大小写的方式对数组进行排序,可以使用:

Arrays.sort(yourArray);
对于不区分大小写的方式:

Arrays.sort(yourArray,String.CASE_INSENSITIVE_ORDER);

希望这有帮助!

Java 8开始,如果数组包含很多元素,也可以使用它

示例:

 Hello
 This
Example
Is
Sorting
public static void main(String[] args) {
    String[] strings = { "x", "a", "c", "b", "y" };
    Arrays.parallelSort(strings);
    System.out.println(Arrays.toString(strings));   // [a, b, c, x, y]
}
如果要忽略该案例,可以使用:

public static void main(String[] args) {
    String[] strings = { "x", "a", "c", "B", "y" };
    Arrays.parallelSort(strings, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {              
            return o1.compareToIgnoreCase(o2);
        }
    });
    System.out.println(Arrays.toString(strings));   // [a, B, c, x, y]
}


首先,您的问题是使用了“compareTo()方法”这是区分大小写的。这意味着大写字母与小写字母分开排序。原因是它是用Unicode翻译的,其中大写字母所显示的数字小于小写字母所显示的数字。因此,您应该使用“compareToIgnoreCase()”,正如前面文章中提到的那样多

这是我的完整示例,说明了如何有效地完成这项工作

创建比较器的对象后,可以在java.util.Arrays中定义的“sort()”版本中传递它

替代选择 方法
compareToIgnoreCase()
,虽然它在很多情况下都能很好地工作(就像英语中的比较字符串一样),但它不会在所有语言和位置上都能很好地工作。这会自动使它成为不适合使用的选择。为了确保它在任何地方都能得到支持,您应该使用
compare()
fromjava.text.Collator

通过调用方法
getInstance()
,可以为您的位置找到一个collator。然后,您应该设置此collator的strength属性。这可以通过
setStrength()完成
方法以及
Collator.PRIMARY
作为参数。使用此备选选项,IgnocaseComp可以像下面一样编写。此版本的代码将独立于位置生成相同的输出

import java.text.Collator;
import java.util.Comparator;

//this comparator uses one Collator to determine 
//the right sort usage with no sensitive type 
//of the 2 given strings
public class IgnoreCaseComp implements Comparator<String> {

    Collator col;

    IgnoreCaseComp() {
        //default locale
        col = Collator.getInstance();

        //this will consider only PRIMARY difference ("a" vs "b")
        col.setStrength(Collator.PRIMARY);
    }

    @Override
    public int compare(String strA, String strB) {
        return col.compare(strA, strB);
    }

}
import java.text.Collator;
导入java.util.Comparator;
//此比较器使用一个拼贴器来确定
//无敏感类型的正确排序用法
//两个给定字符串的
公共类IgnoreCaseComp实现Comparator{
颈缩孔;
IgnoreCaseComp(){
//默认语言环境
col=Collator.getInstance();
//这将只考虑主要差异(“A”vs“B”)
col.setStrength(Collator.PRIMARY);
}
@凌驾
公共整数比较(字符串strA、字符串strB){
返回列比较(strA、strB);
}
}

你真的应该在你的代码约定上下功夫。是的,我会的,感染我,我是java新手。我完全被它束缚住了,不知道这些小问题。当编程与约定保持一致时,我可以给你一点建议。如果你在一件事上错了,在任何地方都要做一件事,而不是做一些正确的事位置和错误的其他位置。如果我有两个字段的类:1)
text
2)
code
。然后我创建了
arraylist
。我想对
arraylist
元素按照
text
进行排序?@Alex请阅读关于在Java中实现可比接口的内容。我认为这是您正在寻找的输出-而不是根据昨天发生的编辑。
return strB.compareToIgnoreCase(strA);
import java.util.Comparator;

    public class IgnoreCaseComp implements Comparator<String> {

        @Override
        public int compare(String strA, String strB) {
            return strA.compareToIgnoreCase(strB);
        }

    }
  import java.util.Arrays;

    public class IgnoreCaseSort {

        public static void main(String[] args) {
            String strs[] = {" Hello ", " This ", "is ", "Sorting ", "Example"};
            System.out.print("Initial order: ");

            for (String s : strs) {
                System.out.print(s + " ");
            }

            System.out.println("\n");

            IgnoreCaseComp icc = new IgnoreCaseComp();

            Arrays.sort(strs, icc);

            System.out.print("Case-insesitive sorted order:  ");
            for (String s : strs) {
                System.out.print(s + " ");
            }

            System.out.println("\n");

            Arrays.sort(strs);

            System.out.print("Default, case-sensitive sorted order: ");
            for (String s : strs) {
                System.out.print(s + " ");
            }

            System.out.println("\n");
        }

    }
 run:
    Initial order:  Hello   This  is  Sorting  Example 

    Case-insesitive sorted order:   Hello   This  Example is  Sorting  

    Default, case-sensitive sorted order:  Hello   This  Example Sorting  is  

    BUILD SUCCESSFUL (total time: 0 seconds)
import java.text.Collator;
import java.util.Comparator;

//this comparator uses one Collator to determine 
//the right sort usage with no sensitive type 
//of the 2 given strings
public class IgnoreCaseComp implements Comparator<String> {

    Collator col;

    IgnoreCaseComp() {
        //default locale
        col = Collator.getInstance();

        //this will consider only PRIMARY difference ("a" vs "b")
        col.setStrength(Collator.PRIMARY);
    }

    @Override
    public int compare(String strA, String strB) {
        return col.compare(strA, strB);
    }

}