字符串中的整数由字符数组合排列
问题描述:
给定一个字符串,其中包含许多正整数。如何按照他们的数字总和来排列它们。意味着最小的数字总和将出现在左侧,最大的数字总和将出现在右侧。字符串中的整数由字符数组合排列
例如:
我有一个字符串= “
2000 10003 1234000 44444444 9999 11 11 22 123
”。因为:11具有数位总和=
1+1 = 2
;- 2000具有数字总和=
2 + 0 + 0 + 0 = 2
; - 10003有数字总和=
1 + 0 + 0 + 0 + 3 = 4...
那么,如何才能做到这一点?
这里是我的代码:
import java.util.Map;
import java.util.TreeMap;
//String s = "2000 10003 1234000 44444444 9999 11 11 22 123";
//return "11 11 2000 10003 22 123 1234000 44444444 9999",
public class WeightSort {
public static String orderWeight(String string) {
Map<Integer, String> chunks = new TreeMap<>();
for (String chunk : string.split (" ")) {
int sum = 0;
for (int i = 0; i < chunk.length(); i++) {
sum += Integer.parseInt ("" + chunk.charAt (i));
}
chunks.put (sum, chunk);
}
String s = chunks.values().toString();
String result = s.substring(1).replaceAll(", ", " ").replaceAll("]", "");
return result;
}
public static void main(String[] args){
String s = "2000 10003 1234000 44444444 9999 11 11 22 123";
System.out.println(WeightSort.orderWeight(s));
}
}
但它只返回:"11 22 123 1234000 44444444 9999"
答
出现这种情况的原因是,TreeMap<K,V>
不允许重复。这就是为什么2000
获取与11
其中有数字的总和一样更换,但在列表低于2000
你的主要部分右后话 - 一个计算数字作品的总和的代码。现在,你需要把这些代码转换为字符串的自定义比较,并比较传递给Arrays.sort
的方法来完成任务:
String[] parts = string.split (" ");
Arrays.sort(parts, new Comparator<String>() {
public int compare(String lhs, String rhs) {
int res = Integer.compare(sumDigits(lhs), sumDigits(rhs));
return res != 0 ? res : lhs.compareTo(rsh);
}
private int sumDigits(String chunk) {
int res = 0;
for (int i = 0; i < chunk.length(); i++) {
res += Integer.parseInt ("" + chunk.charAt (i));
}
return res;
}
});
这是行不通的,它返回“,2000年11月11日10003 22 123 1234000 44444444 9999 “ – Khuong
@ khuong291这是正确的结果。它保持项目具有相同的数字和,与原始列表中的顺序相同(这种属性被称为* stable *)。 – dasblinkenlight
是的,你说得对,但我想要其他的东西。因为2000年和11年,他们都有数字= 2的总和,但是字母'1'首先以'2'出现,所以“11”首先以“2000”出现。 – Khuong