【问题标题】:An array of char arrays, which is a scanner (Java)一个 char 数组的数组,它是一个扫描器 (Java)
【发布时间】:2012-11-03 04:27:30
【问题描述】:

我不知道如何处理一个 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-array 的每个索引都是一个 char 数组,包含 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”需要是一个扫描仪,因为名称不是一个明确的变量。它可以是任何东西。)

【问题讨论】:

  • 您的示例实际上根本不是示例,您只是定义了一个数组数组。您尝试过什么来真正解决您的问题?
  • 你需要某种文件 IO - 比如缓冲流读取器或一些网络东西。扫描仪非常适合您的尝试。只需将每一行从 String 转储到 ArrayList 到 char 数组,如下所示: someString.toCharArray()

标签: java arrays char java.util.scanner


【解决方案1】:

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

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<int> myArr = new ArrayList<int>();
myarr.add(i);

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

【讨论】:

  • 非常感谢 RandomGuy。很实用!我还在研究如何结合“char[][]”、“for”、“ArrayList”和“BufferedReader”来解决我的问题。
  • "ArrayList" 给我以下错误:“标记“int”的语法错误,此标记后预期的尺寸”我发现“ArrayList”示例只有字符串,我明白你的意思已经说过,我真的需要一个“ArrayList”。
  • 我需要查看代码才能知道您收到错误的原因。
  • ArrayList 需要是 Integer 类型,ArrayList。泛型不能采用原始类型。
【解决方案2】:

我会说,是的,让我们停下来换个角度看。

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 变量包含我们将要进行计算的字符串。我们在字符串中的每个字符上创建一个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

这里我们的新值被连接到当前正在构建的字符串,完成后,它应该是我们计算的字符串。
优化/扩展:因为这个字符串连接发生在一个循环中,系统将不断地为新的 String 对象创建/分配空间。这种浪费可以通过使用 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();
}

【讨论】:

    猜你喜欢
    • 2022-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多