当前位置: 首页 > 知识库问答 >
问题:

字符数组的数组,这是一个扫描仪(Java)

花稳
2023-03-14

我不知道如何创建一个字符数组,更糟糕的是,一个作为“扫描器”(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”需要是一个扫描器,因为名称不是一个确定的变量。它可以是任何东西。)

共有2个答案

韩景辉
2023-03-14

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

1) 这些多维数组会占用空间,并不是创建查找表的最有效方法,而这正是您使用它的目的
2)查找表由易于计算的算法定义,从“A”开始,每个字母的值为1-9。1-9范围在到期时重复
3)这需要能够处理从扫描仪输入的任何类型的字符串,并分别检查字符串中的每个字母。

以下是我的总体代码建议:

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();
}
汪阳辉
2023-03-14

如果需要字符,为什么不将数组声明为字符

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都类似于一个数组,但它没有固定的大小,您可以继续添加它。这使得所有的数字都是单独的,而不是作为一个整体。

 类似资料:
  • 我创建了一个简单的扫描器,用于计算中的字符串数。txt文件。每个字符串位于下一行。它算错了,每次它给我数字297,甚至有超过20000个字符串。这个txt文件是由我编写的另一个程序创建的,它从网站获取链接,并使用FileWriter和BufferedWriter将其保存到。txt文件。可能有什么问题? 编辑:字符串示例:

  • 我写了一个小程序,它检查字符串是否按照用户输入的字母顺序排序,并用空白隔开一行。它的工作,这是伟大的,但我不明白的是,为什么我可以使用扫描器创建数组时,大小还没有设置。任何见解都将不胜感激。

  • 我制作了一个简单的程序,根据公式中的3个数字计算增量。但是,小数点后的分数和数字(如3.33、3/4)有问题。如果我将其替换为任何字母,则会出现错误: 线程“main”java中出现异常。util。java上的InputMismatchException。base/java。util。扫描仪。throwFor(Scanner.java:939)访问java。base/java。util。扫描仪。下

  • 问题内容: 问题答案: 您可以尝试这样的事情: 除非我误解你,否则这似乎是很基本的东西

  • 我有一系列骰子,对于每个骰子,我需要提示用户是否要重新滚动它。最简单的方法似乎是使用扫描仪类进行提示 - 我检查他们输入的内容并适当地处理。但是,如果用户输入中不存在请求的数据,则 scanner.next() 将引发异常。所以,扫描仪.hasnext()需要以某种方式适应这里。 这是我的密码;它会将条目输入到响应数组中,但如果用户输入既不包含Y也不包含N,则会抛出异常。 我如何调用scanswo

  • 这是一项学校作业,我已经尝试太久了。我知道如何打印字符总数(如代码所示)。例如,输入和将导致。如何打印或每个名称的长度?