Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Java クラスを使ったソート 

Javaで隣接交換法を用いて配列dataを昇順に並び替え、出力するプログラムを作成する。
ただし、ループ処理には、int型の変数は使わず、以下のCounterクラスを使用する。

という課題が出て、とり組んでみたのですが所々よく分からないので、お力添えしていただければと思います。
課題には下記のような条件が書いてありました。

配列data={54,76,32,89,45,11,8,54,29,67};

[クラス]
Counter
[インスタンス変数]
int型の値を保持するcount
[コンストラクタ]
引数で渡された値を初期値としてインスタンス変数に設定する。
引数を省略された場合、ゼロを設定する。

[メソッド]
increment
値に1加算する
decrement
値に1減算する
compareTo
以下の処理を行う
Counterの保持している値が引数に指定された値と
等しい場合、値0を返す。
Counterの保持している値が引数に指定された値より
小さい場合、0より小さい値を返す。
Counterの保持している値が引数に指定された値より
大きい場合、0より大きい値を返す。
get
Counterの保持している値を添え字として、
引数で渡された配列の要素を取得する。
set
Counterの保持している値を添え字として、
第1引数で渡された配列に第2引数で渡された値を設定する。

1クラス1ファイルで作成
他のクラスのインスタンス・フィールドを直接操作しないようにする。

以下組んだものです。

----Lesson09.java----


class Lesson09{
    
    public static void main(String args[]){
        
        // ソートする配列
        int[] data = {54, 76, 32, 89, 45, 11, 8, 54, 67};

        // 配列をソートする 
        for (Counter left = new Counter(); left.compareTo(data.length - 1) < data.length - 1; left.increment()) {
            
            // 入れ替えが行われたかの判断
            boolean flg = false;
            
            // 配列の要素数分繰り返す 
            for (Counter right = new Counter(); right.compareTo(data.length - left.Counter(data.length - 1) - 1) < 0; right.increment()) {
            //for (Counter right = new Counter(); right.count < data.length - left.count - 1; right.increment()){
                
                int factor = right.get(data);
                
                // right番目の要素番号の値を引数とするコンストラクタを呼び出す
                Counter call = new Counter(factor); //※
                
                right.increment();
                factor = right.get(data);
                right.decrement();
                
                // 左側が大きければ入れ替え
                if (call.compareTo(factor) > 0) {
                    
                    right.increment();
                    
                    // 入れ替え時の一時格納場所
                    int swap = call.Counter(factor);
                    int swap2 = right.get(data);
            
                    // 入れ替え処理
                    right.set(data,swap);        
                    right.decrement();            
                    right.set(data,swap2);
                    
                    flg = true;
                }
            }
            
            // 入れ替えが行われて無ければ終了
            if (flg == false){
                
                break;
            }
        }
    
        // 配列の全ての要素の内容を表示する
        for (Counter loop = new Counter(); loop.compareTo(data.length) < 0; loop.increment()) {

            // 先頭の要素以外を出力する場合
            if (loop.compareTo(0) > 0) {

                System.out.print(", ");
            }
            System.out.print(loop.get(data));
        }
        System.out.println();    
    }
}

----Counter.java----

public class Counter{
     
    // 変数
    private int count = 0;
    
    /**
     * 引数が入力されている場合
     */
    public int Counter(int count) {
        
        this.count = count;
        return this.count;
    }
    
    /**
     * 引数が入力されている場合
     */
    public int Counter() {
        
        count = 0;
        return this.count;
    }
    
    /**
     * インクリメント
     */
    public void increment(){
        
        ++ count;
        return;
    }
    
    /**
     * デクリメント
     */
    public void decrement(){
        
        -- count;
        return;
    }
    
    /**
     * 
     * @param argument 比較対象
     * @return
     */
    public int compareTo(int argument) {
        
        if(count == argument) {
            
            return 0;
            
        } else if(count < argument) {
            
            return -10;
            
        } else {
            
            return 1;
        }
    }

    /**
     * 
     * @param data 引数で渡された配列の要素
     * @return
     */
    public int get(int[] data) {
        return data[count];
    }

    /**
     * 
     * @param data 引数で渡された配列
     * @param value 引数で渡された値
     */
    public void set(int[] data, int value) {
        data[this.count] = value;
    }
}

----以上----
Lesson09.javaの※の部分で、「コンストラクター Counter(int) は未定義です。」と出てしまいます。
しかしCounter.javaではきちんと定義してあると思うのですが…。

是非お力添えいただければと思います。

29

回答

80805

閲覧

29件の回答

評価

0

こっちでは解決したことになってるが?
http://okwave.jp/qa/q5698755.html

評価

0

他のクラスのインスタンス・フィールドを直接操作しないようにする。
という文を見落としていて、その部分を直そうとしたらエラーが出てしまったんです…。

評価

0

取り敢えず置いときますね。
http://www.javaroad.jp/java_class6.htm

評価

0

へぇ、こういう問題のだしかたをするんだ。と、独学の人間からすると興味がわく出題。

仕事でプログラミング書いている人はこんな命名なんてしているのだろうか?

さらにいうと
Javadocの書き方がいやらしい・・
これって、講師としてはわざとなんだよねぇ?

すばらしい!
ナイストラップだ。

評価

0

Counterは講師が書いたんじゃないのね・・すまん勘違いだw

「コンストラクター Counter(int) は未定義です。」
とあるので、コンストラクター作ろうぜ。

評価

0

コンストラクターを作るというのは、
Counter call = new Counter();
ということでしょうか?

評価

0

>しかしCounter.javaではきちんと定義してあると思うのですが…。

確かに定義してあるな。
メソッドは。

でも、コンストラクタはないな。

評価

0

コンストラクタとは

Counter() {
    
    count = 0;
}

のことですか?

評価

0

>2010-02-24 13:51
↑コメのURLを読んでいるのだろうか?

評価

0

Counter(int count) {
 this.count = count;
}
ですか…?

評価

0

ですか?って、試してないの?

評価

0

試してはいるのですが、自信がなくて…。
申し訳ありません

評価

0

>自信がなくて…。

ありもしないものをどうのこうのいってたって仕方ないでしょ。
んなもん、犬のエサにでもしてしまいなさい。

自分で手を動かさないと、何も始まらないよ。

評価

0

仰るとおりです、すみません。
Counter.javaを少し弄ってみました。

----

public class Counter{
     
    // 変数
    private int count = 0;

    
    /**
     * 引数が入力されていない場合
     */
    Counter() {
        
        count = 0;
    }
    
    /**
     * 引数が入力されている場合
     */
    Counter(int count) {
        
        this.count = count;
    }
    
    public int Counter(int count){
        this.count = count;
        return this.count;
    }
    
    /**
     * インクリメント
     */
    public void increment(){
        
        ++ count;
        return;
    }
    
    /**
     * デクリメント
     */
    public void decrement(){
        
        -- count;
        return;
    }
    
    /**
     * 
     * @param argument 比較対象
     * @return
     */
    public int compareTo(int argument) {
        
        if(count == argument) {
            
            return 0;
            
        } else if(count < argument) {
            
            return -1;
            
        } else {
            
            return 1;
        }
    }

    /**
     * 
     * @param data 引数で渡された配列の要素
     * @return
     */
    public int get(int[] data) {
        return data[count];
    }

    /**
     * 
     * @param data 引数で渡された配列
     * @param value 引数で渡された値
     */
    public void set(int[] data, int value) {
        data[this.count] = value;
    }
}

評価

0

をいをい、回答者は、デバッグ要員じゃないよ。

評価

0

> public int Counter(int count){
>
コンストラクタ名と同じメソッド名は作れないですよ。
あと、コンストラクタは戻り値は返せません。

評価

0

public int Counter(int count){
がないとLesson09.javaでエラーが出てしまうのですが…。

----Lesson09.java----

class Lesson09{
    
    public static void main(String args[]){
        
        // ソートする配列
        int[] data = {54, 76, 32, 89, 45, 11, 8, 54, 67};

        // 配列をソートする 
        for (Counter left = new Counter(); left.compareTo(data.length - 1) < 0; left.increment()) {
            
            // 入れ替えが行われたかの判断
            boolean flg = false;
            
            // 配列の要素数分繰り返す 
            for (Counter right = new Counter(); right.compareTo(data.length - left.Counter(data.length - 1) - 1) < 0; right.increment()) {
                
                int factor = right.get(data);
                
                // right番目の要素番号の値を引数とするコンストラクタを呼び出す
                Counter call = new Counter(factor);
                
                right.increment();
                factor = right.get(data);
                right.decrement();

                // 左側が大きければ入れ替え
                if (call.compareTo(factor) > 0) {
                    
                    right.increment();
                    
                    // 入れ替え時の一時格納場所
                    int swap = call.Counter(factor);
                    int swap2 = right.get(data);
                    
                    // 入れ替え処理
                    right.set(data,swap);        
                    right.decrement();            
                    right.set(data,swap2);

                    flg = true;
                }
            }
            
            // 入れ替えが行われて無ければ終了
            if (flg == false){
                
                break;
            }
        }
    
        // 配列の全ての要素の内容を表示する
        for (Counter loop = new Counter(); loop.compareTo(data.length) < 0; loop.increment()) {

            // 先頭の要素以外を出力する場合
            if (loop.compareTo(0) > 0) {

                System.out.print(", ");
            }
            System.out.print(loop.get(data));
        }
        System.out.println();    
    }
}

評価

0

名前変えればいいじゃん。

評価

0

>public int Counter(int count){
>がないとLesson09.javaでエラーが出てしまうのですが…。

とありますが、
public int Counter(int count)で行ってるのって
クラス:Counterの条件のメソッドに当てはまる動きではないですが、問題ないですか??

問題ないとして、
public int Counter(int count)を使ってそうな
int swap = call.Counter(factor);
↑ってわざわざフィールドの値変えて取得する必要ってあるのですか??

評価

0

>コンストラクタ名と同じメソッド名は作れないですよ。

んなこたあない。

評価

0

> public int Counter(int count)で行ってるのって
> クラス:Counterの条件のメソッドに当てはまる動きではないですが、問題ないですか??

上の意味が理解できないのですが…分かりやすく言っていただけると嬉しいです。
ごめんなさい。


> public int Counter(int count)を使ってそうな
> int swap = call.Counter(factor);
> ↑ってわざわざフィールドの値変えて取得する必要ってあるのですか??

その下の入れ替え処理の
right.set(data,swap);
のswapがintなので、と思ったのですが。

評価

0

>> 2010-02-24 16:38
警告はされるが作る方法はアルYO

評価

0

>上の意味が理解できないのですが…分かりやすく言っていただけると嬉しいです。
>ごめんなさい。

あなたが質問内容にあげたメソッドの一覧に
Counterなんてないけど、勝手に作っていいの?

>その下の入れ替え処理の
>right.set(data,swap);
>のswapがintなので、と思ったのですが。

じゃあ、
int swap = call.Counter(factor);で
引数にしてるfactorの定義は?
後、call.Counterの動きはどうなってる?

評価

0

>警告されるが

警告なんて出るの?
コマンドラインからちょこちょことやったが、
なんにも出てこない。
IDEだったら、余計な世話を焼いてくるのかしら。

評価

0

Eclipseだと
Preference>Java>Compiler>Errors/Warnings>Codestyle

Method with a constructor name:

がデフォだとwarningになってるっぽいね。

評価

0

>>コンストラクタ名と同じメソッド名は作れないですよ。
>>
>んなこたあない。
>
>警告はされるが作る方法はアルYO
>
警告出るけど、確かにできました。orz

評価

0

> あなたが質問内容にあげたメソッドの一覧に
> Counterなんてないけど、勝手に作っていいの?

上手く結果が出ないことに焦って問題文を見落としていました。
仰るとおりです。


factorの定義はintで、
call.Counterの動きはcountの値を取得しているんですよね?
でもfactorに入っている値は配列の要素ではないのでしょうか…。

評価

0

自分で書いたコードなのになんで疑問系なんだろう(´・ω・`)

評価

0

>上手く結果が出ないことに焦って問題文を見落としていました。
>仰るとおりです。
と、public int Counter(int count)の存在が危ぶまれたところで、

    public int Counter(int count){
        this.count = count;
        return this.count;
    }

がcall.Counterの実装ですけど
int swap = call.Counter(factor);
だとどうなります?
無駄にcallのcountの値変えて取得してるだけに思えるのですが・・・

int型の配列から取得した要素ですよね、factorって。
ついでにfactorって
factor = right.get(data);
↑で値取得してますよね。
getってなんなんですかね。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。