2017-05-11 78 views
1

這段代碼是爲了按月排序哈希映射而編寫的,但我無法完全理解。任何人都可以解釋一下另外我想知道如果我正在訪問HashMap for循環。 monthAnalysis是hashmap的名稱,month是關鍵。 對不起,我忘了提及,我知道它將數據添加到表中動態創建行。我的問題是前四行代碼。我是Android的Java初學者。任何人都可以解釋代碼

public void addData1(TableLayout tableLayout, HashMap<String, MonthAnalysis> monthAnalysis) { 

    String[] sortedMonthList = (String[]) monthAnalysis.keySet().toArray(); 
    Arrays.sort(sortedMonthList); 

    for (String month : sortedMonthList) { 
     /* Create a TableRow dynamically */ 
     TableRow tr = new TableRow(this); 
     tr.setLayoutParams(new TableLayout.LayoutParams(
       TableLayout.LayoutParams.MATCH_PARENT, 
       TableLayout.LayoutParams.WRAP_CONTENT)); 
     addRowItem(tr, getMonth(month), 1.3f, Typeface.DEFAULT, Color.parseColor("#000000"), Gravity.LEFT); 
     addRowItem(tr, Long.toString(monthAnalysis.get(month).credit), 0.9f, Typeface.DEFAULT, Color.parseColor("#000000"), Gravity.RIGHT); 
     addRowItem(tr, Long.toString(monthAnalysis.get(month).debit), 1f, Typeface.DEFAULT, Color.parseColor("#000000"), Gravity.RIGHT); 
     //addRowItem(tr, convertDate(Long.parseLong(transaction.date)), 1.5f, Typeface.DEFAULT, Color.parseColor("#000000"), Gravity.RIGHT); 

     tableLayout.addView(tr, new TableRow.LayoutParams(
       LayoutParams.MATCH_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
    } 
} 
+0

感謝您的接受! – GhostCat

回答

5
String[] sortedMonthList = (String[]) monthAnalysis.keySet().toArray(); 

那地圖使用字符串代表月份名稱爲鍵的對象。以上retrieves這些鍵(如Set);並將該Set設置爲一個字符串數組。

Arrays.sort(sortedMonthList); 

該數組現在按字母順序排序。

for (String month : sortedMonthList) { 

然後以新的排序順序進行迭代。這就是這一切。

但是,當然,還有一些細微的細節,例如:根據月份名稱的實際情況,上述內容根本沒有多大意義。你看,如果這些月份名稱是「1月」,「Februrary」,......你真的希望按月排序結果是「April」,「Februrary」,「January」等等。等等?!

換句話說:這段代碼看起來很可疑;但它確實取決於傳入Map的內容以確定此代碼是否「有一定意義」;或者是「完全虛假」。

你必須明白:字符串只是字符序列。任何meta如果從這個角度來看這些值,那麼諸如「January」之類的信息應該在「February」之前就會丟失。正如其中一條評論所暗示的,更好的解決方案是使用Enum而不是String;因爲Enums可以寫成遵循特定的訂單(請參閱here瞭解如何操作)。

當然,如果你想繼續使用「原始」字符串,而不是枚舉,你也可以這樣做。這裏唯一的先決條件是:你必須真正理解這些字符串是怎樣的。您可以使用自定義Comparator進行排序。當然,當你知道你有12個可以排序的字符串,並且你知道它們的樣子時,那麼你可以寫一個比較器,理解compare("Jan", "Feb")應該導致「Jan」比「Feb」更小。這是可能的,但嚴重的會朝錯誤的方向發展。

你不寫程序「以某種方式」得到預期的輸出。你不會走上不必要的彎路;你不工作症狀;你看問題的根源,並解決這個問題!

+0

謝謝。所以它不按正確的順序對月份進行排序,比如(Jan,Feb,Mar ... Dec)? –

+0

我同意,如果你不能把鍵作爲'日期',最好至少聲明一個可訂購的枚舉月(用正確的格式)來對鍵進行排序。還有一個更好的方法來實現for循環('monthAnalysis.entrySet().stream()。sorted(...).forEach(...)'),但這是另一回事。 –

+0

@NareshMobarsa不,因爲簡單的字符串不知道每種語言中每個月的順序,所以你不能指望數組按照你的意願排序。 –

相關問題