我是android Java的初学者。任何人都可以解释代码

时间:2017-05-11 08:41:39

标签: java android hashmap

编写此代码是为了按月对hashmap进行排序,但我无法完全理解。谁能解释一下呢。另外我想知道我是否正在for循环中正确访问hashmap。 monthAnalysis是hashmap的名称,month是关键。 对不起,我忘了提到我知道它将数据添加到表动态创建行。我的问题出在前4行代码中。

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

1 个答案:

答案 0 :(得分:5)

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

该地图使用表示月份名称的 String 对象作为KEYS。上述retrieves个密钥(如Set);并将其设置为一个字符串数组。

Arrays.sort(sortedMonthList);

该数组现在按字母顺序排序。

for (String month : sortedMonthList) {

然后在新的排序顺序中迭代。这就是全部。

但是,当然,还有一些微妙的细节,例如:取决于这些月份名称的实际外观,上述内容并没有多大意义。你知道,如果这些月份名称是&#34; 1月&#34;,&#34; Februrary&#34;,...你真的希望&#34;按月排序&#34;导致订单类似于&#34; April&#34;,&#34; Februrary&#34;,&#34; January&#34;,......等等?!

换句话说:这段代码看起来很可疑;但它确实取决于传入的地图的内容,以确定此代码是否具有某种意义&#34 ;;或者是完全虚假的#34;。

您必须明白:字符串只是字符序列。任何信息,例如&#34; 1月和#34;应该在&#34;二月和#34;之前从这个角度看这些值时会丢失。正如其中一条评论所暗示的,更好解决方案是使用枚举而不是字符串;可以编写Enums来遵循特定的订单(有关如何执行此操作,请参阅here。)

当然,如果你想继续&#34; raw&#34;字符串,而不是枚举,你也可以这样做。那里唯一的先决条件是:你必须真正理解这些字符串的样子。您可以使用自定义Comparator进行排序。当然可以;当你知道你有12个可以分类的字符串时,你知道它们会是什么样子;然后你可以编写一个比较器,了解compare("Jan", "Feb")应该导致&#34; Jan&#34;存在&#34;较小&#34;比&#34; 2月&#34;。这是可能的,但严重的方向是错误的。

你不会以某种方式编写程序&#34;达到预期的产量。你不要走弯路;你不能解决症状;你看看问题的根本原因,并解决这个问题!