【问题标题】:Convert more than one char to an int in a string in Java在Java中将多个char转换为字符串中的int
【发布时间】:2015-07-05 01:58:21
【问题描述】:

我了解如何将单个char 转换为int,但是如何将String 转换为chars,以便将chars 转换为ints?例如,对于字符串hello

chars[1] = h => 104
chars[2] = e => 101
chars[3] = l => 108
chars[4] = l => 108
chars[5] = o => 111

输出应该可以很容易地将五个字母的Strings 转换为五个单独的整数,每个整数代表一个字符,然后将它们转换回char 并再次将它们打印为单个String

【问题讨论】:

    标签: java unicode char int


    【解决方案1】:

    你可以这样试试:

    String s = "hello";
    char[] data = s.toCharArray(); // returns a length 5 char array ( 'h','e','l','l','o' )
    

    现在你可以调用这个函数把它转换成int了。

    int charToInt(char []data,int start,int end) throws NumberFormatException
    {
        int result = 0;
        for (int i = start; i < end; i++)
        {
            int digit = (int)data[i] - (int)'0';
            if ((digit < 0) || (digit > 9)) throw new NumberFormatException();
            result *= 10;
            result += digit;
        }
        return result;
    }
    

    【讨论】:

    • 你能解释一下这个功能是如何工作的,所以它不仅仅是盲目的copypasta吗?也许格式化它以匹配 Java MoS? (即与相关语句在同一行的括号,char []datachar[] data,逗号后的空格等)
    • @QPaysTaxes 这个想法是首先创建一个包含String 中字母的char[]。然后,一一转换成int。问题是,他的算法将所有这些组合成一个 int。我不确定这样做的目的是什么,或者他如何决定最终结果应该如何计算,但这似乎不容易逆转(返回String
    • ...也许我应该澄清一下。你能把它放在答案本身吗?否则人们会看答案,复制/粘贴,但不知道它是如何工作的,因为他们没有看 cmets。
    • @QPayTaxes 只需查看my answer.. 它不那么冗长,实际上符合要求(虽然这可能符合要求,但显然令人困惑,并且撤消操作将非常困难)
    【解决方案2】:

    使用getBytes(),您可以获得byte[],其中包含String中每个字母的数字表示:

    byte[] text = "hello".getBytes();
    
    for(byte b : text) {
        System.out.println(b);
    }
    

    这给出了相同的结果:

    String text = "hello";
    
    for(char c : text.toCharArray()) {
        System.out.println((int) c);
    }
    

    这是我能想到的实现这一目标的最简单方法。将其转换回字符串:

    byte[] byteArray = "hello".getBytes();
    
    String string = new String(byteArray);
    

    【讨论】:

    • 这不会为多字节字符提供相同的结果。
    【解决方案3】:

    您可以在StringBuilder 类的构造函数参数中传递给定的字符串,并使用codePointAt(int) 方法。它返回指定索引处字符的 ASCII 值。

    StringBuilder 中还有其他有用的方法,例如 codePointBefore(int)appendCodePoint(int),它们允许您查看之前字符的代码点,并将具有指定代码点的字符分别附加到 StringBuilder

    【讨论】:

      【解决方案4】:

      我在这里假设每个charint 值应该对应于该字符的Unicode code point。如果是这样,那么解决方案很简单:您只需要在 charint 类型之间进行类型转换。这是因为在 Java 中,char 实际上是 Integral type,就像 int 一样。 char 类型可以保存表示 16 位 Unicode 字符的代码点的整数值('\u0000''\uffff'0...65535)。

      解决方案是首先使用toCharArrayString 转换为char[]。然后,只需将每个 char 转换为 int 即可获得 Unicode 码位值:

      int capitalACodePoint = (int)'A';
      

      同样,转换为 char 以取回值:

      char capitalA = (char) 65;
      

      一个可运行的例子:

      String input =  "hello";        
      List<Integer> codePoints = new ArrayList<>();
      
      for (char c : input.toCharArray()) {
          int codePoint = (int)c;
          codePoints.add(codePoint);
          System.out.println(String.format(
                  "char$ %d %s equals %d", 
                  codePoints.size(), c, codePoint));
      }
      
      StringBuilder sb = new StringBuilder();
      
      for (int codePoint : codePoints) {
          sb.append((char) codePoint);
      }
      System.out.println(sb);
      

      打印出来

      char$ 1 h equals 104
      char$ 2 e equals 101
      char$ 3 l equals 108
      char$ 4 l equals 108
      char$ 5 o equals 111
      hello
      

      此代码也适用于非 ASCII 字符。将输入更改为

      String input =  "©†¿™";
      

      打印出来

      char$ 1 © equals 169
      char$ 2 † equals 8224
      char$ 3 ¿ equals 191
      char$ 4 ™ equals 8482
      ©†¿™
      

      【讨论】:

      • 我几乎可以肯定,当您转换为 int 时,您将获得 ASCII 代码点。
      • 这并不重要,因为对于每个具有 ASCII 值的字符,Unicode 代码点和该字符的 ASCII 值都是相同的。
      • 但如果我尝试将纯 Unicode 字符解析为 ASCII,它的工作方式将不一样。它会给我一个错误或未定义的结果
      • 嗯,这仅仅是因为ASCII 只编码 128 个字符,而最新版本的 Unicode 编码大约 110k 个字符。我不明白你的意思,真的。
      • Java 中的 char 表示 16 位 Unicode 字符。因此将char 转换为int 与ASCII 无关。 (实际上甚至不需要强制转换,但它可能使代码更具可读性。)我添加了一个使用 String 的测试用例,其中字符的代码点大于 128。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2014-05-02
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多