字符串中的整数由字符数组合排列

问题描述:

给定一个字符串,其中包含许多正整数。如何按照他们的数字总和来排列它们。意味着最小的数字总和将出现在左侧,最大的数字总和将出现在右侧。字符串中的整数由字符数组合排列

例如:

  • 我有一个字符串= “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; 
    } 
}); 
+0

这是行不通的,它返回“,2000年11月11日10003 22 123 1234000 44444444 9999 “ – Khuong

+0

@ khuong291这是正确的结果。它保持项目具有相同的数字和,与原始列表中的顺序相同(这种属性被称为* stable *)。 – dasblinkenlight

+0

是的,你说得对,但我想要其他的东西。因为2000年和11年,他们都有数字= 2的总和,但是字母'1'首先以'2'出现,所以“11”首先以“2000”出现。 – Khuong