【问题标题】:char[i] returns wrong numberchar[i] 返回错误的数字
【发布时间】:2019-01-07 13:02:37
【问题描述】:

我有一个“算法”,它有一个整数 k 作为输入参数。例如,我将 k = 54321 作为参数传递。在这种方法中我想要:

  • 将此整数转换为 char 数组,这样就可以代替 54321 而是 [5,4,3,2,1] 等等
  • 将此数组升序排序,将每个字符添加到 ArrayList
  • 返回数组列表

但是当谈到 for 循环时,如果我通过 char[position] 获取项目,它会给我随机值。更实际的是,

public class Main {

    public static void main(String[] args) {
        System.out.println(sortMet(54321));
    }

    static ArrayList<Integer> sortMet(int k) {
        ArrayList<Integer> tab_cyfr = new ArrayList<>();
        char[] chars = String.valueOf(k).toCharArray();
        int n = chars.length;
        Arrays.sort(chars);

        for (int i = 0; i < n; i++) {
            tab_cyfr.add(chars[i]);
        }

        return tab_cyfr;
    }

}

这应该在 [1,2,3,4,5] 之后返回我,但返回 [49, 50, 51, 52, 53],这些数字是从哪里来的?

另外很抱歉变量命名,我正在对局部变量进行随机练习。

【问题讨论】:

  • 试试Character#getNumericValue(char)

标签: java


【解决方案1】:

String.valueOf(k).toCharArray() 返回String 中的字符作为它们的char 表示。根据ASCII table491的char值,250等。

您应该将k 转换为数字,而不是chars。这可以通过使用% 操作来完成:

int k = 8421753;
ArrayList<Integer> digits = new ArrayList<>();
while (k > 0) {
    digits.add(k % 10);
    k /= 10;
}
Collections.sort(digits);
System.out.println(digits); // [1, 2, 3, 4, 5, 7, 8]

【讨论】:

    【解决方案2】:

    ASCII 问题

    它被转换为字符串,因此数字作为 ASCII 值存储在 char 数组中。

    问题出在这一行:

    char[] chars = String.valueOf(k).toCharArray();
    

    如果您要查找数字 1、2、3、4、5 的 ASCII 值,您会发现它们分别等于 49、50、51、52、53。

    如何解决问题

    要解决此问题,请对 int 编号运行一个循环,逐位拆分,并将它们存储为 ints,而不是 chars,然后只需对您的 int[] 进行排序。

    【讨论】:

      【解决方案3】:

      将您的 ArrayList&lt;Integer&gt; 替换为 ArrayList&lt;Character&gt; 可以解决此问题,因为它存储字符“1”、“2”等,而不是它们的整数值 49、50...

      所以下面的代码返回你所期望的:[1, 2, 3, 4, 5]

      public static void main(String[] args) {
          System.out.println(sortMet(54321));
      }
      
      static ArrayList<Character> sortMet(int k) {
          ArrayList<Character> tab_cyfr = new ArrayList<>();
          char[] chars = String.valueOf(k).toCharArray();
          int n = chars.length;
          Arrays.sort(chars);
      
          for (int i = 0; i < n; i++) {
              tab_cyfr.add(chars[i]);
          }
      
          return tab_cyfr;
      }
      

      【讨论】:

        【解决方案4】:

        这些数字是数组中字符的 ASCII 码。例如,字符 0 为 48,字符 1 为 49,等等。 您似乎正在使用Integers 的数组列表,因此列表元素将像标准的intlong 整数一样打印。要解决此问题,请将 ArrayList&lt;Integer&gt; 替换为 ArrayList&lt;Character&gt;

        【讨论】:

          【解决方案5】:

          此行无法编译:

          tab_cyfr.add(chars[i]);
          

          所以你得到 [49, 50, 51, 52, 53] 很奇怪。
          即使它编译它也会添加chars[i]的ascii值,
          但你想要它的数值。
          获得它的一种方法是:

          tab_cyfr.add(Integer.parseInt("" + chars[i]));
          

          【讨论】:

            【解决方案6】:

            toCharArray() 方法返回字符数组,排序时数组按其 ASCII 值排序。所以这些随机数是 ASCII 值。
            将 char 转换为 Integer:-

            static ArrayList<Integer> sortMet(int k) {
                    ArrayList<Integer> tab_cyfr = new ArrayList<>();
                    char[] chars = String.valueOf(k).toCharArray();
                    int n = chars.length;
            
            
                    for (int i = 0; i < n; i++) {
                        tab_cyfr.add(Character.getNumericValue(chars[i]));
                    }
                    Collections.sort(tab_cyfr);
                    return tab_cyfr;
                }
            

            【讨论】:

              【解决方案7】:

              此代码应该可以代替。

              public static void main(String[] args) {
                  System.out.println(sortMet(54321));
              }
              
              static ArrayList<Integer> sortMet(int k) {
                  ArrayList<Integer> tab_cyfr = new ArrayList<>();
                  char[] chars = String.valueOf(k).toCharArray();
                  int n = chars.length;
                  Arrays.sort(chars);
              
                  for (int i = 0; i < n; i++) {
                      tab_cyfr.add(Character.getNumericValue(chars[i]));
                  }
                  return tab_cyfr;
              }
              

              Character.getNumericValue(chars[i]) 确保您将实际 char 值推送到 tab_cyfr 而不是它的 ASCII 值。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-05-29
                • 2016-03-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多