2015-10-15 98 views
1

給定一個字符串,其中包含許多正整數。如何按照他們的數字總和來排列它們。意味着最小的數字總和將出現在左側,最大的數字總和將出現在右側。字符串中的整數由字符數組合排列

例如:

  • 我有一個字符串= 「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"

回答

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; 
    } 
}); 
+0

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

+0

@ khuong291這是正確的結果。它保持項目具有相同的數字和,與原始列表中的順序相同(這種屬性被稱爲* stable *)。 – dasblinkenlight

+0

是的,你說得對,但我想要其他的東西。因爲2000年和11年,他們都有數字= 2的總和,但是字母'1'首先以'2'出現,所以「11」首先以「2000」出現。 – Khuong