如何使用整数的比较器实现选择排序?

时间:2017-06-28 10:30:10

标签: java compare comparator comparable selection-sort

我一直在尝试使用比较器在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的链接以供进一步参考:

Selection Sort

StdIn API

提前致谢!!

2 个答案:

答案 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旁边的原始版本。