1

宿題があり、少し困っています。最初の課題は、さまざまなサイズの棒グラフを作成し、ボタンをクリックするたびに調整して並べ替えることです。メイン クラスにアクション リスナーを実装し、2 次クラスを作成して同等の実装を行いました。同等の関数の呼び出しに問題があります。私の配列 int[] can't be resolve は、compariable[] を探している同等のメソッドでは解決できないと書かれています。ヘルプやヒントをいただければ幸いです。これが私のコードです:

import java.util.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

 import javax.swing.*;



 public class TwoSorts extends Applet implements ActionListener

 {
private final int APPLET_WIDTH = 600;
private final int APPLET_HEIGHT = 600;
Button sort;
Label sort_label;
String pr_name;
int[] random = new int[20];
int[] sorter = new int[20];


public void init()

{

    sort = new Button("Sort");
    add(sort);
    sort.addActionListener(this);
    sort_label = new Label("Orange Selection / Black Bubble");
    add(sort_label);
    randomGen(random);
    sorter = random; 
    setBackground (Color.white);
    setSize (APPLET_WIDTH, APPLET_HEIGHT); 
}  

private void randomGen (int...random) {


    for (int i = 0; i < 20; i++){
        random [i] = (int) (20 +(Math.random()*300-20));
        }
}

public void paint(Graphics g)
{
    for (int i = 0; i < 20; i++ ){


        g.setColor(Color.blue);
        g.fillRect((int) (10 + (i*50)), 300, 50, ((random[i])));
        g.setColor(Color.black);
        g.fillRect((int) (10 + (i*50)), 300, 25, (sorter[i]));
    }

    g.drawRect (20, 30, 130, 50);
  sort.setLocation(0,220);
  sort_label.setLocation(0,270);
  sort_label.setSize(400,30);
}


class action extends TwoSorts implements Comparable {


public void actionPerformed(ActionEvent arg0) {


    selectionSort(random);
    insertionSort (sort);
    repaint;

public static void selectionSort (Comparable[] random)  {

    int min;
    Comparable temp;

    for (int index = 0; index < random.length-1; index++)
    {
        min = index;
        for (int scan = index+1; scan < random.length; scan++)
            if (random[scan].compareTo(random[min]) < 0)
                min = scan;

        temp = random[min];
        random[min] = random[index];
        random[index] = temp;
    }

public static void insertionSort (Comparable[] sorter)  {

    for (int index = 1; index < sorter.length; index ++){
        Comparable key = sorter[index];
        int position = index;
        while (position > 0 && key.compareTo(sorter[position-1]) < 0){
            sorter [position] = sorter[position-1];
            position--;
        }

        sorter[position] = key;
    }
}

@Override
public int compareTo(Object o) {
    // TODO Auto-generated method stub
    return 0;
    }
}


@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

}
4

3 に答える 3

4

Comparable は、同じタイプの他のオブジェクトと比較する何らかの理由があるクラスによって実装する必要があります。

たとえば、並べ替える必要がある四角形の棒グラフがある場合、四角形の高さ、幅、および位置を含む四角形のクラスを作成できます。これは作成したクラスであるため、compareTo 関数を実装して、どの Rectangle が別の四角形よりも大きいか小さいかを評価する必要があります。

compareTo() 仕様http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Comparable.htmlを見ると、次のように表示されます。

戻り値: このオブジェクトが指定されたオブジェクトよりも小さい、等しい、または大きいため、負の整数、ゼロ、または正の整数。

したがって、このオブジェクトが compareTo() に渡されたオブジェクトより小さい場合は、0 に等しい場合は - を返し、大きい場合は + を返します。

それを考慮すると、次のようなクラスになる可能性があります

public class MyRect implements Comparable {
    int width;      //width of the rectangle will probably not change
    int height;     //this might be the value you want to compare in compareTo() 
    point position;

    ...

    //getters and setters yada yada
    public int getHeight(){
        return this.height;
    }

    ...

    @Override
    public int compareTo(Object otherRect){

        // if this rectangle's height is greater than otherRect the difference should 
        // be positive, if equal 0, and if less than the difference will be negative
        // exactly as specification for compareTo() states.

        return this.height - (MyRect)otherRect.getHeight();
    }
}

明らかに、私は多くのことを省きましたが、それで正しい方向に向けられるはずです。それをいじって、あなたが思いついたものを見てください。ハッピーコーディング!

于 2012-11-06T03:09:57.420 に答える
1

Comparableは、ソート可能なクラスによって実装されるべきインターフェースです。

Comparableを実装するには、指定されたオブジェクトを別のオブジェクトと比較するメソッドcompareToを実装するだけです。

並べ替え可能なFooという名前のオブジェクトがある場合、Foo は Comparable を実装する必要があります。

これにより、Foo オブジェクトのコレクションを並べ替えることができます。

class Foo implements Comparable {
    Integer fooIndex;

    compareTo(Object otherObject) {
        Foo otherFoo = (Foo) otherObject;
        return this.fooIndex.compareTo(otherFoo.fooIndex);
    }
}

上記は単純なcompareToメソッドの例です。

null をチェックしたり、Foo へのキャストが可能かどうかをチェックしたりしないことに注意してください。

上記の実装により、次のことが可能になります。

List<Foo> fooList = createFooList();
Collections.sort(fooList);

さらに良いことに、型付きのComparable インターフェイスを実装できます (おそらくもっと混乱します)。

これにより、キャストを回避できます。

Class Foo implements Comparable<Foo> {
    Integer fooIndex;

    compareTo(Foo otherFoo) {
        return this.fooIndex.compareTo(otherFoo.fooIndex);
    }
}
于 2012-11-06T03:05:42.320 に答える
0

実装Comparable<T>するインターフェイスは、並べ替えたいクラスのオブジェクトによって異なります。実装のcompareTo(T)メソッドをこのクラスのインスタンス フィールドに委譲して、オブジェクトの順序を決定できます。

最初に、クラス T のオブジェクトはコレクションに保持されますList<T> list。Comparable インターフェイスを使用すると、コレクションを次の 2 つの方法で並べ替えることができ Collections.sort(list);ますSet set = new TreeSet(list);。Collections クラスは元のリストを並べ替え、TreeSet(list) は並べ替えられた新しいコレクションを作成します。どちらの方法でも、リスト内のオブジェクトは Comparable インターフェイスを実装する必要があります。

使用される並べ替えアルゴリズムは Collections クラスの mergesort であり、変更することはできません。Collections.sort() メソッドは、要素を並べ替えるタスクを に委任しますArrays.sort(list.toArray())。内部的に、Arrays クラスはオブジェクトを Comparable にキャストし、compareTo() メソッドを呼び出して要素の比較を実行します。

したがって、選択ソートまたは挿入ソートの実行に関心がある場合は、JDK 戦略に従うことができます。Comparable インターフェイスを実装するオブジェクトの配列を受け取る、さまざまな並べ替えアルゴリズムを実装するクラスを実装できます。

于 2012-11-06T04:29:24.040 に答える