2016-06-07 59 views
-3

我有一個ArrayList定義如下:排序字符串的ArrayList數控在Java中的Android

List<String> where = new ArrayList<String>(); 
where.add("1 Kg"); 
where.add("500 gram"); 
where.add("5 Kg"); 

當我顯示該列表,值示出被示出爲:

1公斤
500克
5 Kg

我希望它顯示如下:

500克
1公斤
5公斤

我應該如何排序。如下圖所示

List<Double> where = new ArrayList<Double>(); 
where.add(0.5); 
where.add(1); 
where.add(5); 

+3

您需要弄清楚如何將所有東西都轉換成一個通用單元,例如,克;然後比較這些數值。 –

回答

3

你需要一個Comparator在那裏你可以寫你的比較邏輯。

請參閱以下實施。

package test; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
     List<String> where = new ArrayList<String>(); 
     where.add("5 Kg"); 
     where.add("500 gram"); 
     where.add("1 Kg"); 

     Collections.sort(where, new MassComparator()); 

     for(String mass : where) { 
      System.out.println(mass); 
     } 
    } 

    public static class MassComparator implements Comparator<String> { 

     @Override 
     public int compare(String weight1, String weight2) { 
      double val1 = Double.parseDouble(weight1.replace("gram", "").replace("Kg", "").trim()); 
      double val2 = Double.parseDouble(weight2.replace("gram", "").replace("Kg", "").trim()); 

      if (weight1.contains("gram")) { 
       val1 *= .001; 
      } 

      if (weight2.contains("gram")) { 
       val2 *= .001; 
      } 

      int result = 0; 

      if (val1 < val2) { 
       result = -1; 
      } else if (val1 > val2) { 
       result = 1; 
      } 

      return result; 
     } 

    } 
} 

輸入

List<String> where = new ArrayList<String>(); 
where.add("500 gram"); 
where.add("2 Kg"); 

輸出

500 gram 
2 Kg 
+0

你可能想用'return Integer.compare(weight1,weight2);'來創建'result'。 – Tom

+0

'weight1'和'weight2'是'String'值。相信我我不喜歡這樣寫,但這是唯一的方法:) – 11thdimension

+0

我的意思是'val1'和'val2'; P。 – Tom

0

存儲你的價值觀爲Double你可以申請上述列表排序上, 也在檢索您可以使用0.5公斤代替500克,如果你的應用程序要求允許它的時間。

1

如果您真的想對String值的表示進行排序而不是協調數據中的值(例如全部以克爲單位)並按照這些值的自然順序對它們進行排序,則需要完成相當多的工作。

  1. 使用Comparator<String> - 請參閱here獲取API。在排序List(API here)時,您將在調用Collections.sort時注入此信息。
  2. 在您的compare方法中,通過正則表達式解析每個String中的兩件事:一個數字(實數或整數,取決於您的數據)和一個測量單位(可能基於定義所有克,千克等變體的映射) 。)
  3. 然後比較測量單元(可能使用另一Comparator<String>!)和經解析的數字將它們轉換爲實際後轉換爲它們的值爲單個單元(可能克等)
  4. 最後比較統一數值數字(如Integer s或Double s等) - 這次使用它們的自然順序

「可選」,處理所有的邊緣情況:null或空值,String不是包含一個數字表示或測量單元,曖昧值,等等,等等

-1

只是使用indexfor週期,

for(int i=0; i<where.size(); i++){ 
    System.out.println(where.get(i)); 
} 
+1

請重新閱讀這個問題。你的回答並不能解決OP所要求的。 – Tom

+0

他想要得到它,什麼是錯的? –

+0

OP有一定數量和重量的字符串。他想根據它們的數量和重量對這些列表項進行分類(「kg」比「克」更重)。您的代碼只是迭代其他列表並忽略排序部分。是的,OP的例子是誤導性的。 – Tom

0

Mr @ 11thdimension已經給出了一個完美的工作解決方案。如果你願意,我想你也可以使用Java 8。基本上是相同的想法,但代碼少。

List<String> where = new ArrayList<String>(); 
    where.add("1 Kg"); 
    where.add("500 gram"); 
    where.add("5 Kg"); 

    Collections.sort(where, new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      double a = (Double.parseDouble(o1.replace("gram","").replace("Kg","").trim()))*(o1.contains("gram")?0.001:1); 
      double b = (Double.parseDouble(o2.replace("gram","").replace("Kg","").trim()))*(o2.contains("gram")?0.001:1); 
      return Double.compare(a,b) ; 
     } 
    }); 
    where.stream().forEach(System.out::println); 
+0

*「我認爲你也可以使用Java 8,如果你願意的話。」*我期待更多的Java 8,而不僅僅是打印排序後的List的流:D。例如使用它來實際排序列表。 – Tom

+0

@Tom噢是的,我認爲是這樣,你的意思是過濾器和其他 –

+0

那麼,'過濾器'可能不是必要的,但是,是這樣的東西:D。或者至少'Collections.sort(其中,(o1,o2) - > {'而不是'Collections.sort(其中,新比較器(){@Override public int compare(String o1,String o2){':D – Tom