Java 字符数组的数组排序错误行为
输出:Java 字符数组的数组排序错误行为,java,Java,输出: String s5 = "peek"; int i[] = {12, 25, 7, 3, 45}; Arrays.sort(i); for(int x : i) { System.out.print(x + ","); } Arrays.sort(s5.toCharArray()); System.out.println(s5); // expected here eekp, but showing peek for(char c :
String s5 = "peek";
int i[] = {12, 25, 7, 3, 45};
Arrays.sort(i);
for(int x : i) {
System.out.print(x + ",");
}
Arrays.sort(s5.toCharArray());
System.out.println(s5); // expected here eekp, but showing peek
for(char c : s5.toCharArray()) {
System.out.print(c + ","); //expected here e,e,k,p , but showing p,e,e,k
}
对于行System.out.println(s5)
我预期为“eekp”,但它显示为“peek”
对于行System.out.print(c+“,”)
我期望是“e,e,k,p”,但它显示的是“p,e,e,k”
数组排序似乎适用于整数,但不适用于字符数组,似乎我做错了什么。您能告诉我吗?更改数组.sort(s5.tocharray())代码>
到
char[]s6=s5.toCharArray()):数组.排序(s6)代码>
然后打印s6的值
toCharArray()从源代码中提供一个新数组,但不修改源代码。打印时,您打印的是源数组,而不是包含已排序字符的数组更改Arrays.sort(s5.tocharray())代码>
到
char[]s6=s5.toCharArray()):数组.排序(s6)代码>
然后打印s6的值
toCharArray()从源代码中提供一个新数组,但不修改源代码。打印时打印的是源数组,而不是包含排序字符的数组字符串是不可变的(大部分)
Arrays.sort(s5.toCharArray())代码>
上述操作对字符数组的副本进行排序,并且不会修改实际的字符串值数组
JDK 1.8中toCharArray
的内部代码
char result[]=新字符[value.length];
数组复制(值,0,结果,0,值,长度);
存储副本并对其排序(引用中的新对象)
char[]copy=s5.toCharArray();
数组。排序(复制);
除非是为了好玩,否则不要尝试
Field-Field=String.class.getDeclaredField(“值”);
字段。setAccessible(true);
字符串s5=“peek”;
Arrays.sort((char[])field.get(s5));
系统输出打印LN(s5);
字符串是不可变的(大部分)
Arrays.sort(s5.toCharArray())代码>
上述操作对字符数组的副本进行排序,并且不会修改实际的字符串值数组
JDK 1.8中toCharArray
的内部代码
char result[]=新字符[value.length];
数组复制(值,0,结果,0,值,长度);
存储副本并对其排序(引用中的新对象)
char[]copy=s5.toCharArray();
数组。排序(复制);
除非是为了好玩,否则不要尝试
Field-Field=String.class.getDeclaredField(“值”);
字段。setAccessible(true);
字符串s5=“peek”;
Arrays.sort((char[])field.get(s5));
系统输出打印LN(s5);
正确无误。您的代码将在排序后立即丢弃新创建的数组。您将一个新的匿名数组传递给Arrays.sort
,后者对新数组进行了排序,然后新数组超出了范围,因为您忽略了将数组放入变量中
此外,我可以使用Unicode代码点而不是char
显示代码
Unicode代码点编号
Java中的char
类型已过时,甚至无法表示Unicode中定义的一半字符。相反,您应该使用代码点编号,即在Unicode标准中为每个字符分配一个编号
您可以通过调用获取这些整数代码点编号的流()
下面是一些示例代码。作为输入,我们使用一个包含两个表情符号的字符串。使用char
type,我们错误地看到了四个?
,其中我们期望两个字符的数字。然后我们使用代码点,我们正确地看到这对表情符号的一对数字(128075128506)。最后,我们使用Java streams对代码点编号进行排序,并收集排序后的编号以构建一个新的String
对象
String input=“正确。排序后,您的代码将立即丢弃新创建的数组。您将一个新的匿名数组传递给了Arrays.sort
,它对新数组进行了排序,然后新数组超出了范围,因为您忽略了将数组放入变量中
此外,我可以使用Unicode代码点而不是char
显示代码
Unicode代码点编号
Java中的char
类型已过时,甚至无法表示Unicode中定义的一半字符。相反,您应该使用代码点号,Unicode标准中为每个字符分配一个数字
您可以通过调用获取这些整数代码点编号的流()
下面是一些示例代码。作为输入,我们使用一个包含两个表情符号的字符串。使用char
type,我们错误地看到四个?
,其中我们期望两个字符数字。然后我们使用代码点,我们正确地看到一对数字(128075128506)最后,我们使用Java streams对代码点编号进行排序,并收集排序后的编号以构建一个新的String
对象
String input=“每次调用toCharArray
都会得到一个新的字符数组,其中包含字符串内容的副本。实际上不能更改字符串的内容。字符串是不可变的。嗨,在对char数组进行排序之后,可以使用排序后的值创建一个新字符串<代码>字符[]字符=s5.toCharArray();数组。排序(字符);字符串newString=新字符串(字符)代码>提示:s5.ToCharArray()
返回什么?特别是:通读:它做什么?这与您假设的有什么不同?每次调用toCharArray
都会得到一个新的字符数组,其中包含字符串内容的副本。实际上不能更改字符串的内容。字符串是不可变的。嗨,在对char数组进行排序之后,可以使用排序后的值创建一个新字符串<代码>字符[]字符=s5.toCharArray();数组。排序(字符);字符串newString=新字符串(字符)代码>提示:s5.ToCharArray()
返回什么?特别是:通读:它做什么?这与您的假设有什么不同?而且,重要的是,JavaString
s是不可变的。没有其他方法可以重新排序t
3,7,12,25,45,peek
p,e,e,k,