数组按照降序排序

3

我是一名学习Java编程的新手,经常在这个网站上学习编程方法。今天,我在练习编程时遇到了一个问题。

我有一个数组:

    final int EXAMS = 5;
    int[] scores = new int [EXAMS];

然后通过Scanner对象从用户那里请求此数组的值:

for (int index = 0; index < EXAMS; index++)
    {
        System.out.println("Enter the score for " + (index+1) +":");
        scores[index] = kb.nextInt();
        if (scores[index] < 0){
            System.out.println("The number you have entered is invalid.");
            scores[index] = kb.nextInt();
        }
    }

我成功地实现了对数值“scores[]”进行升序排序:

       Arrays.sort(scores);
        System.out.println("The sorted int array is:");
        for (int number : scores) 
        {
            System.out.println("Number = "+ number);
        }

但我希望排序是按降序排列的。当我使用

Arrays.sort(scores, Collections.reverseOrder());

时,会出现错误提示:“没有找到适合排序的方法。” 请帮忙解决。


在插入时对数组进行排序。 - gifpif
7个回答

3
以下是可行的代码(使用Integer对象而不是原始的int):
Integer[] test = {1, 2, 4, 3, 5};
Arrays.sort(test, Collections.reverseOrder());
System.out.println(Arrays.toString(test)); // [5, 4, 3, 2, 1]

3
Collections.reverseOrder() 

这样做行不通,因为数组是原始类型。你可以将 int 更改为 Integer,或尝试一些不同的方法,比如:

Arrays.sort(scores);
ArrayUtils.reverse(scores);

最后一个选项是自己编写代码。


2

Arrays类中没有接受int[]Comparatorsort方法。Arrays类中接受Comparatorsort方法需要一个引用类型的数组(而int[]是一种原始类型的数组)。

如果你将scores数组的类型从int[]改为Integer[],你的代码将会起作用,因为Arrays类中的public static <T> void sort(T[] a, Comparator<? super T> c)方法将匹配你的Arrays.sort(scores, Collections.reverseOrder());调用。

final int EXAMS = 5;
Integer[] scores = new Integer [EXAMS]; // the only required change
for (int index = 0; index < EXAMS; index++) {
    System.out.println("Enter the score for " + (index+1) +":");
    scores[index] = kb.nextInt();
    if (scores[index] < 0){
        System.out.println("The number you have entered is invalid.");
        scores[index] = kb.nextInt();
    }
}
Arrays.sort(scores, Collections.reverseOrder());
System.out.println("The sorted int array is:");
for (int number : scores)  {
    System.out.println("Number = "+ number);
}

1
你只需要将数组类型从原始类型更改为包装类,例如int[] scores = new int [EXAMS] 更改为 Integer[] scores = new Integer[EXAMS]Arrays.sort 只接受包装类作为第一个参数,不接受原始类型。

0

我会先初始化数值。

// we do 1 to 6 because, 6th iteration is where we going to stop
// so that it will count up to 5.
int[] arr = IntStream.range(1, 6).toArray();

然后将其传递到下面的数组中。

如果我们需要使用原始类型int进行排序,我会采取以下方法。

  1. 按升序对列表进行排序
  2. 反转所有值

注意:这种方法的时间复杂度为N log N。 当然,它可以在N时间复杂度下更快地进行排序,但是 对于我来说,这段代码最易读和易懂。

// this func sorts in n log n time complexity
    public void sortReverse(int[] arr) {
        // 1. now sort all values in descending order
        for (int i = 0, j = arr.length - 1; i < arr.length / 2;i++) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            j--;
        }
    }

1
除非在公开展示Java代码时需要,否则请遵循Java命名约定(不要使用下划线),并花时间撰写真正的英语单词(而不是_u_之类的简写)。 - kleopatra
我已经根据Java命名规范将函数更新为驼峰式;) - Sayyid Iskandar Khan

0
Arrays.sort(a, Collections.reverseOrder());

不适用于原始类型。请尝试以下内容:

Integer[] a = new Integer[]{1,2,3,5,4};
            Arrays.sort(a,Collections.reverseOrder());
            for(int i:a)
            {
                System.out.println(i);
            }

0

Java中的数组没有排序方法。但是ArrayList有一个排序方法。您可以使用以下代码按照相反的顺序对列表进行排序。

List l=new ArrayList();
l.add(5);
l.add(1);
l.add(2);
l.add(3);
Collections.sort(l,Collections.reverseOrder());
System.out.println(l);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接