0

char 配列の配列を処理する方法がわかりません。さらに悪いことに、「スキャナー」(System.in) である配列を処理する方法もわかりません。説明します:

1 = A, J, S.
2 = B, K, T.
3 = C, L, U.
4 = D, M, V.
5 = E, N, W.
6 = F, O, X.
7 = G, P, Y.
8 = H, Q, Z.
9 = I, R.

名前を入力し、各文字から対応する数字を受け取り(出力)たい。しかし、私はそれを行う方法がわかりません。例:

Ericson = 5993165.

「名前を計算」したいので、各数値を完全に独立したインデックスにしたいのです。

スキャナーなしで試した例を次に示します。

public static void main(String[] args) {

    int[][] arrays = new int[9][3];

}

9 配列の各インデックスは、3 文字の char 配列です。たぶん、私は完全に間違った方法で考えています。

ご清聴ありがとうございました!

編集:

私はこのようなことを実験しています:

public static void main(String[] args) {
    char[][][][] Array1 = {{{{1},{'A'},{'J'},{'S'}}}};
    char[][][][] Array2 = {{{{2},{'B'},{'K'},{'T'}}}};
    char[][][][] Array3 = {{{{3},{'C'},{'L'},{'U'}}}};
    char[][][][] Array4 = {{{{4},{'D'},{'M'},{'V'}}}};
    char[][][][] Array5 = {{{{5},{'E'},{'N'},{'W'}}}};
    char[][][][] Array6 = {{{{6},{'F'},{'O'},{'X'}}}};
    char[][][][] Array7 = {{{{7},{'G'},{'P'},{'Y'}}}};
    char[][][][] Array8 = {{{{8},{'H'},{'Q'},{'Z'}}}};
    char[][][] Array9 = {{{9},{'I'},{'R'}}};
    System.out.println('E'+'R'+'I'+'C'+'S'+'O'+'N');
}

以前の考えよりはましですが、まだ遠いと思います。(繰り返しますが、大きな問題は次のとおりです。名前は明確な変数ではないため、この「ericson」はスキャナーである必要があります。それは何でもかまいません。)

4

2 に答える 2

0

そうです、立ち止まって、これをまったく別の方法で見てみましょう。

1)これらの多次元配列はスペースを占有し、ルックアップテーブルを作成する最も効率的な方法ではありません-それはあなたがそれを使用するものです。
2) ルックアップ テーブルは、計算が簡単なアルゴリズムによって定義されます。「A」で始まり、各文字には 1 ~ 9 の値が与えられます。有効期限が切れると、1 ~ 9 の範囲が繰り返されます。3) これは、 からのあらゆる種類の文字列入力を処理し、文字列内の各文字を個別に検査
できる必要があります。Scanner

これが私の合計コードの提案です:

String incomingString = "Ericson";

String outputValue = "";
for (int i = 0; i < incomingString.length(); i++) {
    int numberRepresentation = incomingString.charAt(i);

    if (numberRepresentation >= 'a') {
        numberRepresentation -= 'a';
    } else if (numberRepresentation >= 'A') {
        numberRepresentation -= 'A';
    } 

    numberRepresentation = (numberRepresentation % 9) + 1;

    outputValue += numberRepresentation;
}

説明:

1) 文字列全体の反復:

for (int i = 0; i < incomingString.length(); i++) {
    int numberRepresentation = incomingString.charAt(i);

    // other code here 

}

incomingString 変数には、計算を行う文字列が含まれています。String 内の各文字に対してループを作成しfor、指定された文字の整数値を変数 numberRepresentation に格納します。この整数値は、ASCII/Unicode テーブルに存在する場所の番号です。
最適化/拡張: String length() メソッド呼び出しは毎回計算する必要があり、ループ外の定数に抽出できます。

2) 文字を正規化します。

    // other code above
    if (numberRepresentation >= 'a') {
        numberRepresentation -= 'a';
    } else if (numberRepresentation >= 'A') {
        numberRepresentation -= 'A';
    }
    // other code below

ご存じかもしれませんが (知らないかもしれませんが)、文字リテラルは ASCII テーブルの値を持つ整数として使用できます。このコードは、文字が小文字 ('a' の値以上) か大文字 ('A' の値以上) かをチェックします。'a' または 'A' の値を減算することにより、numberRepresentation に格納される数値は、アルファベットの 'a' からの文字の距離です。
最適化/拡張: これらのチェックは、文字が少なくとも 'a' または 'A' であることのみを確認します。文字が実際に文字であることは確認しません。文字でない場合は、エラーをスローする必要があります。さらに、いくつかの文字メソッドを使用すると、読みやすさを向上させることができます。

3) 個々のキャラクターの変換を適用します。

    // other code above
    numberRepresentation = (numberRepresentation % 9) + 1;
    // other code below

ここで実際の作業が行われます。正規化された各文字値のモジュラスと可能な値の数 (9) が計算されます。これらの結果は 0 ~ 8 になるため、結果に 1 を追加して、可能な範囲を 1 ~ 9 にします。
Optimizations/Expansions : 値 9 は定数であるため、ローカルの名前付き変数に抽出する必要があります。これにより、必要に応じてエンコーディングを変更することもできます。つまり、1-5 エンコーディングを優先する場合です。行末の「+ 1」を削除すると、「0」を可能な出力値にすることができます。

4) 実行中の出力に追加:

    // other code above
    outputValue += numberRepresentation;
    // other code below

ここで、新しい値が現在構築中の文字列に連結され、終了すると、計算された文字列になります。
最適化/拡張: この文字列連結はループ内で行われるため、システムは常に新しい文字列オブジェクトのスペースを作成/割り当てます。この無駄は、StringBuilder オブジェクトを使用して一連の計算された文字を結合することで回避できます。

展開: 最も重要なことは、このコードを複数回使用する場合は、簡単にアクセスできるようにメソッドに抽出する必要があることです。


すべての拡張が実装された完成したコード:

public static String calculateName(String incomingString) throws Exception {
    StringBuilder outputBuilder = new StringBuilder();

    final int encodingRange = 9;
    final int limit = incomingString.length();
    for (int i = 0; i < limit; i++) {
        int numberRepresentation = incomingString.charAt(i);

        if (!Character.isLetter(numberRepresentation)) {
            throw new Exception("Incorrect String format");
        }

        if (Character.isLowerCase(numberRepresentation)) {
            numberRepresentation -= 'a';
        } else {
            numberRepresentation -= 'A';
        }

        numberRepresentation = (numberRepresentation % encodingRange) + 1;

        outputBuilder.append(numberRepresentation);
    }

    return outputBuilder.toString();
}
于 2016-03-09T08:29:00.947 に答える
0

char が必要なのに、配列を char として宣言しないのはなぜですか

public static void main(String[] args) {

char[][] arrays = new char[][] {
  { 'A', 'J', 'S' },
  { 'B', 'K', 'T' },
  { 'C', 'L', 'U' },
  { 'D', 'M', 'V' },
  { 'E', 'N', 'W' },
  { 'F', 'O', 'X' },
  { 'G', 'P', 'Y' },
  { 'H', 'Q', 'Z' },
  { 'I', 'R', '*' }
} ;

}

次に、配列を通過して文字を見つけ、行番号+1を返すネストされたforループを作成します。これは、0から始まり、番号+1を配列リストに入れるためです。

ArrayList<int> myArr = new ArrayList<int>();
myarr.add(i);

arraylist は配列に似ていますが、サイズが固定されておらず、追加し続けることができます。これにより、すべての数値が個別に保持され、全体として保持されません。

于 2012-11-03T05:28:52.280 に答える