【问题标题】:Java int array and char array implementation: why does this work?Java int 数组和 char 数组实现:为什么会这样?
【发布时间】:2020-02-07 01:50:47
【问题描述】:

我正在编程研讨会课程中研究 Kattis 问题“abc”。该问题要求您输入 0 到 100 之间的三个整数,并让它们与另一组三个字符输入的模式匹配:A

public class ABC {
    public static void main(String[] args) {
        var scanner = new Scanner(System.in);
        int[] num = new int[3];
        for (int i=0; i<num.length; i++) {
            num[i] = scanner.nextInt();
        }
        Arrays.sort(num);
        char[] chArr = scanner.next().toCharArray();
        for (int i=0; i<chArr.length; i++) {
            System.out.println(num[chArr[i] - 'A']); //How does num[chArr[i] - 'A'] work?            
        }
    }
}

输入:

1 2 3

C A B

输出:

3 1 2

所以,我的问题是:最后 println 中的表达式是如何工作的?我是在 SO 上发帖的菜鸟,因此我们将不胜感激地接受任何建议。

【问题讨论】:

  • char 是一个整数类型。 'A' - 'A' 为零。 'A' + 1'B'。您需要强制转换才能正常看到它,因为char 是 16 位宽,int 是 32 位。从int 转换为char 需要缩小范围。
  • char 分配给 ASCII 表的数值。例如,'Z' 的数值为 90,'0' 的数值为 48。'Z' - '0' 的数值为 42,即 '*'
  • tbh,这似乎是一个很容易找到答案的问题。还有其他人问过这个问题。 stackoverflow.com/questions/21208308/…stackoverflow.com/questions/20720186/…
  • 正如我所说,我同意 SO。您似乎很容易忽略这篇文章,不是吗?

标签: java


【解决方案1】:

C 中的char 实际上只是一个 8 位整数。它倾向于用于表示 ASCII 字符,但在代码中它是一个整数。或者换句话说,charuint8 本质上是相同的类型(事实上,在大多数实现中,一个是另一个的别名)。

这种关系以某种形式存在于 Java 中。 char 基本上是一个整数,它把自己呈现为一个字符。因此,您可以对字符进行整数运算。

检查num[chArr[i] - 'A']

  1. chArr[i] 检索chArr 的索引i 处的字符,chars 的数组。假设这是'C'
  2. 注意'C'的ASCII值是67。
  3. 注意'A'的ASCII值是65。
  4. 67 - 65 = 2。所以,'C' 是字母表的第三个字母,这意味着它对应于 num 的索引 2。
  5. 检索num 的索引2 处的值,并打印它。

【讨论】:

  • 非常感谢。感谢您如此迅速地解释这一点。
【解决方案2】:

这很容易理解:

例子:

char a = 'a';
char b = 'b';

// zero = 0 a this point
int zero = a - 'a';

// one = 1; and so on 
int one = b - 'b';  

现在在你的情况下:

// is equivalent to whatever you enter and the difference of 'A'.
num[chArr[i] - 'A'] 

但如果您输入的内容与A 的差异大于nums 的大小,您将获得Array out bounds exception

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多