Java中的异构数组类型转换

时间:2018-10-12 08:34:18

标签: java arrays

我是Java的新手,目前正在处理实现数组的代码。

Scanner sc= new Scanner(System.in);
String str=sc.nextLine();
int count[]= new int[25];
int len = str.length(); 

// Initialize count array index 
for (int i = 0; i < len; i++) 
    {count[str.charAt(i)]++; } //This line is the issue.

我想知道charAt()是否返回char值,然后count [](整数数组)如何存储它,如果是,那么如何存储。 我已从此链接中提取了源代码enter link description here

谢谢。

4 个答案:

答案 0 :(得分:0)

this question处的答案深入探讨了允许从charint的转换以及原因。

为了给您的情况一个简单的答案,char将基于其ASCII Value转换为int

例如,如果字符为“ A”,则将其转换为65,将“ B”转换为66,依此类推。每个字符都有一个关联的整数代码,您可以在ASCII Table

之类的网站上在线检查该整数代码

答案 1 :(得分:0)

如果需要在字符串中存储每个图表的数字表示形式,可以执行以下操作:

int[] nums = new int[length];

for(int i = 0; i < length; i++){
   char character = testStr.charAt(i);
   nums[i] = Character.getNumericValue(character);
}

祝您编程愉快!

答案 2 :(得分:0)

地图不是数组。数组的数字索引从0开始,并且您尝试使用字符值作为索引...

所以您有2条可能的路径:

  • 使用Map<char, int>,该字符将由字符本地索引-但是,首次遇到字符时,您必须注意将值设置为1。优点:接受非字母字符,缺点:处理更复杂
  • 坚持使用数组,并使用从字符到[0-26 [范围内的数字]的转换。 Character.getNumericValue是一个很好的星形标记,因为它会映射[10-36 [范围内的所有字母-顺便说一下,您需要一个大小为 26 而不是25
  • 的数组

您的代码可能会变成:

Scanner sc= new Scanner(System.in);
String str=sc.nextLine();
int count[]= new int[26];
int len = str.length(); 

// Initialize count array index 
for (int i = 0; i < len; i++) {
    val = Character.getNumericValue(str.charAt(i)) - 10;
    if (val >= 0) {  // ok we have an alpha character
        count[val]++;
    } 
}

答案 3 :(得分:0)

如果输入超出ASCII范围,则此字符计数方法将无法正常工作。这是使用地图和流在完整Unicode范围(包括大于2 16 的代码点)上完成相同工作的一种优雅方法:

import java.util.Map;
import java.util.stream.Collectors;

public class Counter {

    public static void main(String [] args) {
        String input = "geeksforgeeks \uD83D\uDE02";
        Map<String, Integer> countMap = input.codePoints()
                .mapToObj(codePoint -> new String(Character.toChars(codePoint)))
                .collect(Collectors.toMap(c -> c, c -> 1, (n1, n2) -> n1 + n2));
        System.out.println(countMap);
    }
}

输出为

  

geeksforgeeks

     

{= 1,r = 1,s = 2,e = 4,f = 1,g = 2,k = 2,= 1,o = 1}

请注意,此特殊的“绘图”由2个字符组成。它的codePoint(十六进制)是D8 3D DE 02,并被命名为“ FACE WITH TEARS OF JOY”。

如果现在通过将input.codePoints()替换为input.chars()来运行同一程序,则会得到以下错误结果:

  

geeksforgeeks

     

{= 1,?= 1,r = 1,s = 2,e = 4,f = 1,g = 2,k = 2,?= 1,o = 1}


特别感谢Xah Lee