4

2 つのテキスト文字列を照合するプログラムを作成しています。たとえば、「google」と「chrome」は「gcohorgmlee」になります (文字の長さが同じであると想定できます)。

public class Collate {

    String result;
    String a;
    String b;

    public void main(String[] args) {
        System.out.printf("Enter 1st word: ");
        Scanner in1 = new Scanner(System.in);
        a = in1.next();
        System.out.printf("Enter second word: ");
        Scanner in2 = new Scanner(System.in);
        b = in2.next();

    }

    public String collate(String a, String b) {
        String accumulator;
        this.a = a;
        this.b = b;


        for (int i = 0; i < a.length(); i++) {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}

しかし、私は を呼び出す方法に行き詰まっていますcollate()。私はJavaに非常に慣れておらず、何も知らないので、いくつかのポインタと助けをいただければ幸いです!

4

5 に答える 5

2

最も簡単な答えは、簡単に言って、使用collate(a, b)して、値を変数に割り当てるか、画面に出力することです...

より長い答えは同じように終わりますが、プログラムが実際には現時点では実行されないことを指摘することから始まります...

public void main(String[] args){プログラムの有効なエントリ ポイントではありません。代わりに、public static void main(String[] args){

これを行うと、アプリケーションの非静的部分に静的コンテキストからアクセスできないことを示す多くのコンパイラエラーが発生します...

最も簡単な解決策は、から呼び出すことができるクラスにaconstructorを提供することです...Collatemain

public class Collate{
    String result;
    String a;
    String b;

    public void main(String[] args){
        new Collate();
    }

    public Collate() {
        System.out.printf("Enter 1st word: "); 
        Scanner in1 = new Scanner(System.in);
        a = in1.next();
        System.out.printf("Enter second word: ");
        Scanner in2 = new Scanner(System.in);
        b = in2.next();
        String collation = collate(a, b);
        System.out.println(collation);
    }

    public String collate(String a, String b){
        String accumulator;
        this.a = a;
        this.b = b;


        for(int i = 0; i < a.length(); i++)
        {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}

更新しました

私は責任をめぐって素敵な大暴れをしたようです。クラスの責任は、ユーザーが何をしたいのか、何をしたいのかをユーザーに尋ねることであると主張することができますが、クラスは自己完結型のタスクである必要があることも議論の余地があります.

public class Collate{
    String result;
    String a;
    String b;

    public void main(String[] args){
        System.out.printf("Enter 1st word: "); 
        Scanner in1 = new Scanner(System.in);
        a = in1.next();
        System.out.printf("Enter second word: ");
        Scanner in2 = new Scanner(System.in);
        b = in2.next();
        Collate collate = new Collate();
        String collation = collate.collate(a, b);
        System.out.println(collation);
        new Collate();
    }

    public String collate(String a, String b){
        String accumulator;
        this.a = a;
        this.b = b;


        for(int i = 0; i < a.length(); i++)
        {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}

コンテキストが大幅に欠落しているため、具体的な解決策に到達することは不可能です...

于 2013-09-16T02:00:26.233 に答える
2

他の回答から何も奪わないように、これが私の見解です。

ここに私が変更したものがあります:

  • クラス変数を削除しました。collateそれらは、通話以外ではあまり意味がありません。
  • 削除されin2ました。実際には 1 しか持たないはずScannerです。
  • 削除されaccumulatorました。使用されませんでした。
  • に変更mainされましたstatic。それ以外の場合は、Java によってエントリ ポイントとして認識されません。
  • クラスのインスタンス変数に依存しなくなり、直接呼び出すことができるようになったため、 に変更collateされました。staticstaticmain
  • result空の文字列に初期化されます。

コード:

public class Collate {
    public static void main(String[] args) {
        Scanner in1 = new Scanner(System.in);
        System.out.printf("Enter 1st word: ");
        String a = in1.next();
        System.out.printf("Enter second word: ");
        String b = in1.next();
        System.out.println(collate(a,b));
    }

    public static String collate(String a, String b) {
        String result = "";
        for (int i = 0; i < a.length(); i++) {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return result;
    }
}

より効率的なオプションは : を使用することStringBuilderです
(ただし、これは実稼働環境の外で記述されたコードや、ほとんどの実稼働コードでも必要になる可能性は低いです)

public static String collate(String a, String b) {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < a.length(); i++) {
        result.append(a.charAt(i));
        result.append(b.charAt(i));
    }
    return result.toString();
}
于 2013-09-16T02:30:03.110 に答える
1

現在、クラスの特定のインスタンスに属する変数をcollate使用していますが、実際にはそうする必要はありません。ジョブを実行するために必要なすべての情報がパラメーターとして渡されます。インスタンス変数 (フィールド)とは何も役に立たないので、それらを削除できます。また、変数もメソッド内でのみ有用であるため、代わりにそこで宣言する必要があります (これが目的なので、それを使用します)。変数; 最初は空の文字列に設定する必要があります)。(実際、以前の結果の末尾に文字を追加するだけなので、複数回呼び出すと、現在のバージョンは失敗します。)StringCollateCollate.aCollate.bresultcollateaccumulator""collate

を作成できますcollate static。つまり、特定の に属する情報は必要なくCollate、 から直接呼び出すことができますmain

public static String collate(String a, String b) {
    String accumulator = "";

    for (int i = 0; i < a.length(); i++) {
        accumulator += a.charAt(i);
        accumulator += b.charAt(i);
    }
    return accumulator;
}

// in main
System.out.println(collate(a,b));
于 2013-09-16T02:00:20.407 に答える
0

だから...このコードにはいくつかの問題があります。

あなたのメンバー変数は宣言されていませaん。したがって、から参照することはできません(これも である必要があります)。bstaticmainstatic

aorの代わりにローカル変数を使用しb(名前が混同されないように)、それらを に永続化しmainます。メンバー変数を完全に取り除くこともできます。

public static void main(String... args) {
    String firstWord;  // takes the place of a
    String secondWord; // takes the place of b
    // code omitted for brevity
}

クラスでメソッドを呼び出すには、 の新しいインスタンスをインスタンス化するCollate必要があります。

Collate col = new Collate();

メソッドを呼び出すには、インスタンスを使用し、collate()並べ替えたいものを表す引数を指定して呼び出します。空欄の埋め方は、読者の練習問題として残しておきます。

System.out.println(col.<insert_method_here>(_which_was_a?, _which_was_b?));

最後に、変数accumulatorは のスコープに存在しますがcollate、存在しresultません。accumulator追加先を選択します。メンバー変数への割り当ても取り除きます。

于 2013-09-16T02:22:28.250 に答える
-1

全体として、ここに必要なものがあります

package mypackage;

import java.util.Scanner;

public class Collate {

    public static void main(String[] args) {
        Scanner in1 = null;
        Scanner in2 = null;
        try {
            System.out.printf("Enter 1st word: ");
            in1 = new Scanner(System.in);

            String a = in1.next();

            System.out.printf("Enter second word: ");
            in2 = new Scanner(System.in);
            String b = in2.next();

            System.out.println(new Collate().collate(a, b));
        } finally {
            in1.close();
            in2.close();
        }

    }

    public String collate(String a, String b) {
        String result = "";
        for (int i = 0; i < Math.max(a.length(), b.length()); i++) {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}
于 2013-09-16T02:00:09.737 に答える