我有一个"算法",它有一个整数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 表49
是 1
的字符值、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 值。