我一直在尝试使用比较器在Java中实现Selection Sort程序。
然而,虽然该程序适用于字符串,但它不能用于整数和大小写混合字符(还没有尝试过浮点值!)
这是我的代码:
package edu.princeton.cs.algs4;
import java.util.Comparator;
public class Selection {
public static void sort(Comparable[] a) {
int n = a.length;
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i+1; j < n; j++) {
if (less(a[j], a[min])) min = j;
}
exch(a, i, min);
assert isSorted(a, 0, i);
}
assert isSorted(a);
}
public static void sort(Object[] a, Comparator comparator) {
int n = a.length;
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i+1; j < n; j++) {
if (less(comparator, a[j], a[min])) min = j;
}
exch(a, i, min);
assert isSorted(a, comparator, 0, i);
}
assert isSorted(a, comparator);
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static boolean less(Comparator comparator, Object v, Object w)
{
return comparator.compare(v, w) < 0;
}
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
private static boolean isSorted(Comparable[] a) {
return isSorted(a, 0, a.length - 1);
}
private static boolean isSorted(Comparable[] a, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(a[i], a[i-1])) return false;
return true;
}
private static boolean isSorted(Object[] a, Comparator comparator) {
return isSorted(a, comparator, 0, a.length - 1);
}
private static boolean isSorted(Object[] a, Comparator comparator, int
lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(comparator, a[i], a[i-1])) return false;
return true;
}
private static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
StdOut.println(a[i]);
}
}
public static void main(String[] args) {
String[] a = StdIn.readAllStrings();
Selection.sort(a);
show(a);
}
}
顺便说一下,&#34; StdIn&#34;是普林斯顿大学为标准输入提供的类,readAllStrings返回从文件/标准输入读取的所有字符串的数组。
以上代码适用于字符串数据。但是,当我想为整数数据测试相同的代码时,编译失败。
这是我修改main()部分代码的方法:
public static void main() {
Integer[] a = StdIn.readAllInts();
Selection.sort(a);
Selection.show(a);
}
readAllInts()类似于readAllStrings()。它读取所有整数并返回一个整数数组。
然而,在编译时我收到以下错误:
int []无法转换为Integer []
因此我再次替换代码如下:
public static void main(String[] args) {
int[] a = StdIn.readAllInts();
Selection.sort(a);
Selection.show(a);
}
然而,我又遇到了错误:
Selection.java:80:错误:类中的方法显示选择不能应用于给定的类型; 理由:论证不匹配; int无法转换为Comparable []
并将此错误发送至:
Selection.java:79:错误:没有为sort(int [])找到合适的方法
有谁能告诉我如何解决这个问题? 我找到了一种有效的方法,但我需要首先初始化整数数组,并提供值。
这意味着我无法读取文件,这与我对String的方式不同。
以下是各个API的链接以供进一步参考:
提前致谢!!
答案 0 :(得分:2)
你有一个经典的&#34;阻碍不匹配&#34;这里的情况:
StdIn.readAllInts()
为您提供int[]
Selection.sort()
和Selection.show()
更喜欢Integer[]
根据迈克的建议,没有重写StdIn.readAllInts
,没有神奇的解决方案。您需要从int[]
获取StdIn.readAllInts()
,创建相同长度的Integer[]
,并将数字从int[]
复制到Integer[]
{1}}逐个使用循环。
答案 1 :(得分:2)
Integer[] a = StdIn.readAllInts();
Selection.sort(a);
抛出int[] cannot be converted to Integer[]
因为方法readAllInts()
返回int[]
顾名思义,不同基类型的数组不能互相投射。
int[] a = StdIn.readAllInts();
Selection.sort(a);
抛出另一个异常,因为你的sort()
方法需要一个Comparable
数组(这是一个对象数组)并得到一个int
的数组...
由于int
不是Class
,因此它不会实现接口Comparable
。
您还可以编写sort()
版本,其中包含int
个数组。 (还有其他一些原始类型,如果你需要......)
另请查看the methods of class Arrays
:其中大部分都有普通版本或Object
旁边的原始版本。