按字母数字的总和排列字符串中的整数

时间:2015-10-15 01:50:04

标签: java

给定一个包含许多正整数的字符串。如何用它们的数字排列它们。表示最小的数字总和将出现在左侧,最大的数字总和将出现在右侧。

例如:

  • 我有一个字符串=“2000 10003 1234000 44444444 9999 11 11 22 123”。必须返回:“11 11 2000 10003 22 123 1234000 44444444 9999”因为:

  • 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"

2 个答案:

答案 0 :(得分:2)

发生这种情况的原因是TreeMap<K,V>不允许重复。这就是为什么200011替换为具有相同数字位数的原因,但在列表中的后面比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();
    }
}