Java int数组和char数组实现: why does this work?

标签 java

我正在编程研讨会类(class)中研究 Kattis 问题“abc”。该问题要求您输入 0 到 100 之间的三个 int,并让它们与另一组三个 char 输入的模式匹配,大小写为:A < B < C。这里 'A' 将是具有最小值的 int,'B'将是第二大值,等等。我确定了我的逻辑,但不确定如何将值与字符匹配。然后一位同学给了我最后一行的帮助,但我没有机会询问它是如何工作的。我的代码如下:

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在 C 中实际上只是一个 8 位整数。它通常用于表示 ASCII 字符,但在代码中它是一个整数。或者换句话说,charuint8本质上是相同的类型(事实上,在大多数实现中,一个是另一个的别名)。

这种关系以某种形式持续存在于 Java 中。一个char本质上是一个将自身呈现为字符的整数。因此,您可以对字符进行整数运算。

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

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

关于Java int数组和char数组实现: why does this work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60106066/

相关文章:

java - Android Realm copyToRealmOrUpdate 创建嵌套对象的副本

java - 将十六进制字节转换为实际字节

java - android数据库未打开-SQLITE

java - 何时安装 keystore 以及何时只安装包装在 keystore 中的证书

java - 使用 JTable 和 JTextField 打印 JPanel

java - 如何避免重复并对存储在 LinkedHashMap 中的列表进行计数

java - Eclipse 继续运行我的旧 Web 应用程序

java - 将 ASN1 包从标准 Java (JRE 1.5+) 迁移到 J2ME (CLDC 1.1)

java - 审核:子修改的父实体修订(Javers/Envers/... + Hibernate)

java - 如何通过java反射获取kotlin extensions中声明的Properties或Function