2014-10-05 40 views
0

我有一个ArrayList<HashMap<String,String>>,我想对它排序。我在logcat的ArrayList输出是这样的:排序ArrayList散列图

[{num=0, username=p, startPoliPro=A, finalPoliPro=B, diff=0}, 
{num=1, username=e, startPoliPro=C, finalPoliPro=D, diff=548.0Km}, 
{num=2, username=e, startPoliPro=E, finalPoliPro=F, diff=3.0Km}] 

我想基于由升序“差异”值列表进行排序,这样的logcat必须是这样的:

[{num=0, username=p, startPoliPro=A, finalPoliPro=B, diff=0}, 
{num=2, username=e, startPoliPro=E, finalPoliPro=F, diff=3.0Km}, 
{num=1, username=e, startPoliPro=C, finalPoliPro=D, diff=548.0Km}] 

我看了很多类似的话题,并尝试类似

Collections.sort(final_itinList, new Comparator<HashMap< String,String >>() { 

    @Override 
    public int compare(HashMap<String, String> lhs, HashMap<String, String> rhs) { 
     // Do your comparison logic here and retrn accordingly. 
     return lhs.get("diff").compareTo(rhs.get("diff"));      
    } 
}); 

没有成功。任何帮助,将不胜感激

回答

1

目前,您要比较两个String对象:

return lhs.get("diff").compareTo(rhs.get("diff")); 

你真正想要做的是什么比较返回的整数,所以你需要做这样的事情:

return (Integer.parseInt(lhs.get("diff")) - Integer.parseInt(rhs.get("diff"))); 
+0

感谢您的回复。鉴于距离是双重格式,我已将您的代码更改为Double.parseDouble,但出现错误“返回类型与Comparator >不兼容。 >)”。任何建议; – 2014-10-05 16:16:51

+0

解决。非常感谢。我使用“返回Double.compare(Double.parseDouble(lhs.get(”diff“)),Double.parseDouble(rhs.get(”diff“)));” – 2014-10-05 16:22:08

0

您的比较器正在比较两个字符串。这可能是为什么列表没有正确排序。应该将“diff”字符串解析为整数(或浮点数)以进行比较。

如果你的对象总是具有相同的结构,我会建议创建一个自定义对象的列表(其中diff是一个表示公里数的整数),而不是使用地图列表。在这种情况下,您可以使自定义对象实现为Comparable。

喜欢的东西:

public class MyCustomObject implements Comparable<MyCustomObject> { 

    private String mNum; 

    private String mUsername; 

    private String mStartPoliPro; 

    private String mFinalPoliPro; 

    private int mDiff; 

    @Override 
    public int compareTo(MyCustomObject another) { 
     return mDiff - another.getDiff(); 
    } 

    public String getNum() { 
     return mNum; 
    } 

    public void setNum(String num) { 
     mNum = num; 
    } 

    public String getUsername() { 
     return mUsername; 
    } 

    public void setUsername(String username) { 
     mUsername = username; 
    } 

    public String getStartPoliPro() { 
     return mStartPoliPro; 
    } 

    public void setStartPoliPro(String startPoliPro) { 
     mStartPoliPro = startPoliPro; 
    } 

    public String getFinalPoliPro() { 
     return mFinalPoliPro; 
    } 

    public void setFinalPoliPro(String finalPoliPro) { 
     mFinalPoliPro = finalPoliPro; 
    } 

    public int getDiff() { 
     return mDiff; 
    } 

    public void setDiff(int diff) { 
     mDiff = diff; 
    } 
} 

,然后只需拨打

List<MyCustomObject> myList = // create your object list 
Collections.sort(myList); 
+0

恐怕OP不希望延长'HashMap' – msrd0 2014-10-05 15:41:10

+0

和OP从来没有说过他是使用JSON,他只是表现出ArrayList.toString()的'输出' – msrd0 2014-10-05 15:46:50

+0

没说扩展HashMap。但是数据结构列表在该特定示例上似乎不正确。看来,OP实际上需要他可以分类的列表。 Json部分是一个猜测(也许是一个糟糕的) – 2014-10-05 15:52:41