给定一个包含许多正整数的字符串。如何用它们的数字排列它们。表示最小的数字总和将出现在左侧,最大的数字总和将出现在右侧。
例如:
我有一个字符串=“2000 10003 1234000 44444444 9999 11 11 22 123
”。必须返回:“11 11 2000 10003 22 123 1234000 44444444 9999
”因为:
11的总和= 1+1 = 2
;
2 + 0 + 0 + 0 = 2
; 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"
答案 0 :(得分:2)
发生这种情况的原因是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;
}
});
答案 1 :(得分:0)
public class WeightSort {
public static String orderWeight(String string) {
String[] parts = string.split(" ");
Arrays.sort(parts, Comparator.comparingInt(WeightSort::sumDigits).thenComparing(lhs -> lhs));
return String.join(" ", parts);
}
private static int sumDigits(String chunk) {
return chunk.chars().map(Character::getNumericValue).sum();
}
}