char[i] 返回错误的数字



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

  • 将此整数转换为 char 数组,以便代替 54321 将是 [5,4,3,2,1] 等等
  • 按升序对数组进行排序,将每个字符添加到数组列表
  • 返回数组列表

但是当涉及到 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],这些数字来自哪里?

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

>String.valueOf(k).toCharArray()返回String中的字符作为其char表示形式。根据 ASCII 表491 的字符值、2 50等。

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

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]

ASCII 问题

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

问题是这一行:

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

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

如何解决问题

要解决此问题,请对 int 数字运行循环,将其逐个数字拆开,并将它们存储为 ints ,而不是 chars ,然后对int[]进行排序。

替换

您的ArrayList<Integer>ArrayList<Character>解决此问题,因为它存储字符"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;
}
<</div> div class="one_answers">

这些数字是数组中字符的 ASCII 代码。例如,48 表示字符0,49 表示字符1,依此类推。您似乎使用的是 Integer s 的数组列表,因此列表元素将像标准int一样打印并long整数。要解决此问题,请将ArrayList<Integer>替换为 ArrayList<Character>

此行不编译:

tab_cyfr.add(chars[i]);

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

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

toCharArray()方法返回字符数组,当您对数组进行排序时,数组按其 ASCII 值排序。所以这些随机数是 ASCII 值。
要将字符转换为整数:-

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;
    }

这段代码应该可以代替。

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 值。

最新更新