首页 > 解决方案 > 我们可以在java中传递一个字符作为整数数组的索引吗

问题描述

我是 Java 新手,正在练习一些程序。有人可以在//第 10 行向我解释以下程序吗

public static void main(String[] args) {
        String str1 = "xxyz";
        String str2 = "yxzx";
        System.out.println("Original strings: " + str1 + "  " + str2);
        System.out.println(stringPermutation(str1, str2));
    }

    public static void stringPermutation(String str1, String str2) {
        int[] arr = new int[500];
        for (int i = 0; i < str1.length(); i++) {
     System.out.println(arr[(int) str1.charAt(i)] += 1); //line 10

        } 
}

它显示以下输出:

Original strings: xxyz  yxzx
1
2
1
1

我试图理解,怎么arr[(int) str1.charAt(i)]i.e, arr['x']可能。请帮助我理解这一点。

标签: java

解决方案


当您初始化一个空整数数组时,每个项目的初始值为零,每个索引arr将包含 0

int[] arr = new int[500];
arr[0] = 0;
arr[1] = 0;
//...
arr[500] = 0;

x 的 ASCII 值是 120,y 是 121,z 是 122,因为该arr字段包含 500 个项目,因此 120、121 和 122 在范围内。

在您的循环中,您将 1 添加到每个元素。因此,当您str1 = "xxyz"遇到第一个 x 时,将 1 添加到索引中arr[120],因此arr[120]变为 1,并且当再次遇到 x 时,将 1 添加到使得arr[120]变为 2 的值。

arr[(int) 'x'] += 1 //=> arr[120] + 1 = (0 + 1) = 1
arr[(int) 'x'] += 1 //=> arr[120] + 1 = (1 + 1) = 2
arr[(int) 'y'] += 1 //=> arr[121] + 1 = (0 + 1) = 1
arr[(int) 'z'] += 1 //=> arr[122] + 1 = (0 + 1) = 1

arr['x']是可能的,因为在 java 中char数据类型是单个 16 位整数,而int是 32 位有符号整数。

更新:

在程序的后续部分,第二个循环在str2char 索引处减一,如果str2str1值的排列,则所有项目arr都应重置为 0。

在 str1 上的循环之后。数组中的值是

arr[0] = 0
//...
arr[120] = 2 //arr['x']
arr[121] = 1 //arr['y']
arr[122] = 1 //arr['z']
//...
arr[500] = 0

什么时候str2 = "yxzx"

arr[(int) 'y'] -= 1 //=> arr[121] - 1 = (1 - 1) = 0
arr[(int) 'x'] -= 1 //=> arr[120] - 1 = (2 - 1) = 1
arr[(int) 'z'] -= 1 //=> arr[122] - 1 = (1 - 1) = 0
arr[(int) 'x'] -= 1 //=> arr[120] - 1 = (1 + 1) = 0

循环后str2的值将被重置为 0

arr[0] = 0
//...
arr[120] = 0 //arr['x']
arr[121] = 0 //arr['y']
arr[122] = 0 //arr['z']
//...
arr[500] = 0

因此,如果所有值都为零,则遍历所有数组,则 str2 是 str1 的排列。


推荐阅读