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 个字母的字符数组。也许我的想法完全错误。

非常感谢大家的关注!

编辑:

我正在尝试这样的事情:

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

你想要一个字符,为什么不将数组声明为字符

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', '*' }
} ;

}

然后有一个嵌套的for循环遍历数组以查找字母并返回行号+1,因为它从0开始,然后将数字+1放入arraylist

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

任何 arraylist 都像一个数组,但它没有固定的大小,你可以继续添加它。这使所有数字保持独立,而不是整体。

于 2012-11-03T05:28:52.280 回答
0

我会说,是的,让我们停下来用完全不同的方式看待这个问题。

1)那些多维数组占用空间,并不是创建查找表的最有效方式——这就是您使用它的方式。
2)查找表由一种易于计算的算法定义,从'A'开始,每个字母被赋予1-9的值。范围 1-9 在到期时重复。
3) 这需要能够处理来自 a 的任何类型的 String 输入Scanner,并单独检查 String 中的每个字母。

这是我的总代码建议:

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 变量包含我们将要进行计算的字符串。我们在字符串中的每个字符上创建一个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-9。
优化/扩展:值 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 回答