我正在开发一个程序来对字符串列表执行选择排序。程序的输入是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
对这个问题的任何帮助都将不胜感激。谢谢你。
匿名用户
您的代码的问题不在于比较器本身。您会希望使用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);
}
输出只显示<代码>红色的原因是,您正在用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