当前位置: 首页 > 知识库问答 >
问题:

如何在Java中使用比较器实现选择排序

江德海
2023-03-14

我正在开发一个程序来对字符串列表执行选择排序。程序的输入是6个字符串。程序的输出应该是按最后一个字符排序的字符串列表。

以下是我尝试过的

import java.util.Arrays;
import java.util.Scanner;
import java.util.List;
import java.util.Comparator;

public class Exercise_20_21 {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter 6 strings: ");
        // Step 1: proccess strings from input
        String data = input.next();
        String[] list = data.split(" ");
        for(int i=0; i < list.length; i++){
            System.out.print(list[i]+" ");
        }
        selectionSort(list, new Comparator<String>(){
            @Override
            public int compare(String w1, String w2){
                if(w1.charAt(0) > w2.charAt(0)){
                    return -1;
                }
                else if( w1.charAt(0) < w2.charAt(0)){
                    return 1;
                }
                else {
                    return 0;
                }
            }
        });
        for(int i=0; i < list.length; i++){
            System.out.print(list[i]+" ");
        }
    }

    

    public static <E> void selectionSort(E[] list, Comparator<? super E> comparator) {
        Arrays.sort(list,comparator);
    }
}

预期:

Enter 6 strings: red blue green yellow orange pink
red blue orange pink green yellow

实际:

Enter 6 strings: red blue green yellow orange pink
red red

对这个问题的任何帮助都将不胜感激。谢谢你。

共有2个答案

华俊弼
2023-03-14
匿名用户

您的代码的问题不在于比较器本身。您会希望使用input.nextLine()来能够读取整行。使用next将只读取直到下一个分隔符(在您的情况下是空格)。

对于比较器部分,Java已经提供了用于比较字符串和其他对象的比较器。这是比较器。naturalOrder(),可以这样使用:

public static void main(String args[]) {
    Scanner input = new Scanner(System.in);
    System.out.print("Enter 6 strings: ");
    // Step 1: proccess strings from input
    String data = input.nextLine();
    String[] list = data.split(" ");

    System.out.println(Arrays.toString(list));

    selectionSort(list, Comparator.naturalOrder());

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


public static <E> void selectionSort(E[] list, Comparator<? super E> comparator) {
    Arrays.sort(list, comparator);
}

缑嘉玉
2023-03-14

输出只显示<代码>红色的原因是,您正在用next()而不是nextLine()读取一行。

输入字符串的元素之间用空格分隔,因此,Scanner实例在读取第一个单词red后将停止。然后只打印一个元素(红色)的数组,然后打印排序后的数组(仍然只打印红色元素)。

您可以通过用nextLine()替换nextLine()调用来修复代码,并缩短比较器的长度,如下所示:

public class Main {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter 6 strings: ");
        // Step 1: process strings from input
        String data = input.nextLine();
        System.out.println(data);

        String[] list = data.split(" ");
        System.out.println("Printing the strings");
        for (int i = 0; i < list.length; i++) {
            System.out.println(list[i] + " ");
        }

        System.out.println("\nPrinting the sorted strings");
        selectionSort(list, Comparator.comparing(s -> s.charAt(s.length() - 1)));
        for (int i = 0; i < list.length; i++) {
            System.out.println(list[i] + " ");
        }
    }


    public static <E> void selectionSort(E[] list, Comparator<? super E> comparator) {
        Arrays.sort(list, comparator);
    }
}

 类似资料:
  • 我被给了下面的代码作为家庭作业。我被要求为雇员对象实现比较器。compare方法返回一个int。但是,如果对employee类中的方法进行比较,则没有一个方法返回int。谁能给我一些关于比较方法应该如何工作的指导?谢谢。

  • 我正在尝试编写一个使用最小优先级队列的算法,所以我在谷歌上四处查看并找到了PriorityQueue。不过,似乎为了使用它,我需要告诉它我希望它如何排列优先级,并且这样做的方法是使用比较器(我想比较我的“Node1”对象的特定数据字段)。更多的谷歌搜索提出了创建一个新的比较器的想法,它实现了比较器但覆盖了比较方法。我正在尝试的是这样(以及它的其他变体): 编译器有几个理由提出抗议,其中之一是我没有

  • 因此,我尝试将插入排序与必须传入的通用比较器一起使用。我无法更改方法名称。我如何实现一个比较器来传递到insertionSort方法中?我是java和面向对象编程的新手。 该测试只是一个junit测试。

  • 我想学习java中的比较器,我在网上找到了这个很好的例子,我的问题是如何更改这个代码,使宠物的名字按年龄和降序排列,以便最大的是第一个,最小的是最后一个?

  • 排序算法有不少,当然,一般的语言中都提供某个排序函数,比如Python中,对list进行排序,可以使用sorted(或者list.sort()),关于这方面的使用,在我的github代码库algorithm中有几个举例,有兴趣的看官可以去那里看看(顺便告知,我在Github中的账号是qiwsir,欢迎follow me)。但是,在某些情况下,语言中提供的排序方法或许不适合,必须选择某种排序算法。

  • 我知道这些接口用于对集合中的对象进行排序。但我怀疑这两者的真正区别。我读到的一个事实是,如果要比较两个对象而不使用当前对象,请使用Compariable(此)。 但我的问题是即使使用比较器,我们也会比较相同的对象类型。 这里真正的区别是什么。我很困惑。假设下面的例子, 如果我使用比较器,我会让一个类实现比较器,而不是这个。年龄,它有人。年龄那么这里有什么不同呢? 我不知道Collections.s