2017-06-28 10 views
2

コンパイラを使用してJavaで選択ソートプログラムを実装しようとしています。プログラムは、文字列のために正常に動作している間選択の実装方法整数のコンパレータを使用してソートする?

しかし、それは整数と混在ケース文字で失敗した(まだ浮動小数点値を試していない!)

ここに私のコードです:ことで

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); 
    } 
} 

ところで、 "StdIn"はPrinceton Universityから標準入力用に提供されたクラスであり、readAllStringsはファイル/標準入力から読み込まれたすべての文字列の配列を返します。

上記のコードは、文字列データに対して完全に機能しました。しかし、整数データの同じコードをテストしたかったとき、コンパイルは失敗しました。

これは私がmain()の部分のコードを改変する方法である:

public static void main() { 
     Integer[] a = StdIn.readAllInts(); 
     Selection.sort(a); 
     Selection.show(a); 
} 

がreadAllInts())(readAllStringsと同様です。すべての整数を読み込み、整数の配列を返します。

しかし、コンパイル時に私は次のエラーを得た:次のように[]したがって

私は再びコードを置き換えINT []は整数に変換することはできません

public static void main(String[] args) { 
     int[] a = StdIn.readAllInts(); 
     Selection.sort(a); 
     Selection.show(a); 
} 

しかし、もう一度私はエラーがある:

選択。 java:80:error:クラスSelectionのメソッドは指定された型に適用できません。 理由:引数の不一致。

Selection.java:79:intがに匹敵[]

と、このエラーに変換することはできませんエラー:ソートに見つかりません適切な方法([] int型)

でした誰もしてくださいどうすればこの問題を回避できますか? 私は動作する1つのメソッドを見つけましたが、まず整数配列を初期化して値を提供する必要があります。

これは、私がStringの場合とは違って、ファイルから読み取ることができないことを意味します。ここで

はさらに参照するためのそれぞれのAPIへのリンクです:事前に

Selection Sort

StdIn API

感謝!!

+0

私は、プリンストン大学が提供するAPIを標準APIではなく、上記のすべてのエラーにつなげることを強く示唆していません。コードを理解し、標準のJavaライブラリを使用して実装します。自信を持っていれば、* API *を使い始めることができます。しかし、プログラミング課題では、プリンストン大学のAPIだけを使用する必要があります。 – doctorwho

答えて

2

あなたがここに古典的な "インピーダンスの不一致" の状況を持っている:

  • StdIn.readAllInts()はあなたにint[]
  • Selection.sort()Selection.show()を与えるマイクの提案につきStdIn.readAllIntsを書き換えるのショートInteger[]

を好みます、魔法の解決策はありません。 StdIn.readAllInts()からint[]を取得し、同じ長さのInteger[]を作成し、ループを使用してint[]からInteger[]までの数字を1つずつコピーする必要があります。

+0

おかげで兄弟!出来た!! :)私は間違いを理解していたが、それはまだ明らかではなかった。しかし、あなたの答えによって説明されるように、多くのことが突然明らかになりました。私がしなければならなかったのは、int []をInteger []にひとつずつコピーして、ぼんやりとしたものでした!ソート作業! – doctorwho

2
Integer[] a = StdIn.readAllInts(); 
Selection.sort(a); 

int[] cannot be converted to Integer[]をスローし、その名前が示唆する、異なる基本型の配列が互いの中にキャストすることができないようint[]を返すreadAllInts()方法。

int[] a = StdIn.readAllInts(); 
Selection.sort(a); 

は、intとして

Classではありません...あなたのsort()方法はComparableの配列を期待して、別の例外がスローされます(つまり、オブジェクトの配列である)とintの配列を取得しますインターフェイスComparableを実装していません。

またintの配列をとるsort()のバージョンを書くことができます。 (必要な場合はその他のプリミティブ型もあります)

the methods of class Arraysも参照してください。ほとんどの場合、ジェネリックまたはObjectのプリミティブなバージョンがあります。

+0

混乱を解消してくれてありがとう。そして、リンクのための大きな感謝。私を助けてくれました! :) – doctorwho

関連する問題