インターフェイスを使用していくつかの文字列ソートメソッドを作成しようとしています。アプリケーションドライバクラスは、メインのSimplePriorityQueueオブジェクトクラスを呼び出しますが、この呼び出しを行うときに、インターフェイスを実装するクラスを引数として渡します。インターフェイスを実装するクラスはいくつかあります(1つは長さで比較し、1つはアルファベット順(値で)、もう1つは逆の長さなど)。そのため、SimplePriorityQueueクラスの1つのコンストラクターですべてを処理できるはずです。
Eclipseデバッガーを使用する場合、Applicationクラスが行pq = new SimplePriorityQueue(new StringByLength());を実行するとすぐに、「sourcenotfound」エラーがポップアップ表示されます。コードコメントに示されているように。
これが私が持っているものです:
//the Interface
package cs15200.review.srijitag;
public interface Comparator {
public int compare(Object o1, Object o2);
}
これがソートクラスの1つです。他にもいくつかありますが、それらはすべてほぼ同じです
//StringByLength class, which sorts by length
package example.cs151xx;
import java.util.Comparator;
public class StringByLength implements Comparator {
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
return s2.length() - s1.length();
}
public boolean equals(Object o)
{return (o instanceof StringByLength);}
}
//the relevant portion of the Application class
import example.cs151xx.Prompt;
import cs15200.review.srijitag.SimplePriorityQueue;
import example.cs151xx.StringByLength;
import cs15200.review.srijitag.StringByLengthReverse;
import cs15200.review.srijitag.StringByValue;
import cs15200.review.srijitag.StringByValueIgnoreCase;
import cs15200.review.srijitag.IntegerIncreasing;
import java.util.Comparator;
public class Application {
////////////////
//Driver Program
////////////////
public static void main(String[] args)
{
//Construct object to test; let the user specify what Comparator
// object to construct to order the priority queue
SimplePriorityQueue pq;
char howPrioritize = Prompt.forChar("Enter how to prioritize queue\n v (by value)\n i (value ignore case)\n l (by length)\n r (by reverse length)\n\nChoice","virl");
if (howPrioritize == 'v')
pq = new SimplePriorityQueue(new StringByValue());
else if (howPrioritize == 'i')
pq = new SimplePriorityQueue(new StringByValueIgnoreCase());
else if (howPrioritize == 'l')
pq = new SimplePriorityQueue(new StringByLength()); //ERROR THROWN
else
pq = new SimplePriorityQueue(new StringByLengthReverse());
[...more code to finish up rest of driver class]
//The relevant parts SimplePriorityQueue class which has the constructors, accessors, and methods
package cs15200.review.srijitag;
import example.cs151xx.StringByLength;
import java.util.Comparator;
public class SimplePriorityQueue{
public SimplePriorityQueue(Comparator whatever){
check = whatever;
}
public void enqueue(Object item){
if(list.length==rear+1)
doubleSize();
if (rear==-1)
list[0]=item;
else{
for(int i=rear;i>=0;i--){
int z = check.compare(item,list[i]);
if(z<=0){
list[i+1]=list[i];
list[i]=item; }
else{
list[i+1]=item;
}
}
}
rear++;
}
[...more accessors and mutators]
//instance variables
private Object[] list=new Object[1];
private int rear=-1;
private Comparator check;
}
次の簡単な例を試してみたので、この基本的な形式(インターフェイスを実装するオブジェクトを引数として渡し、そのインターフェイスのタイプのオブジェクトをパラメーターとして使用する)が機能するはずです。
package cs15200.review.srijitag;
import example.cs151xx.StringByLength;
import java.util.Comparator;
public class temp {
public static void main(String[] args) {
Comparator z = new StringByLength();
System.out.println( z.compare("hi", "what's up"));
Comparator y = new StringByValue();
System.out.println(y.compare("hi", "what's up"));
System.out.println( lookee(new StringByLength())); //should return the same result as z.compare(...)
System.out.println(lookee(new StringByValue())); //should return the same result as y.compare(...)
}
public static int lookee(Comparator test){
return test.compare("hi", "what's up");
}
}
では、SimplePriorityQueueクラスのコンストラクターで何が間違っているのでしょうか。よろしくお願いします。