在特定的json元素上对jsonobjects的arraylist进行排序

时间:2014-10-18 12:39:34

标签: java android json arraylist gson

我编写了一些代码,使用Gson库创建一个json数据的数组列表,看起来像这样。

{
 "filename": "somefile.mp3"
 "artist": "artist1"
 "title": "title1"
 "genre": "rock"
}
{
 "filename": "anotherfile.mp3"
 "artist": "artist2"
 "title": "title2"
 "genre": "electro"
}

我试图找出如何通过artist元素对此数组列表进行排序。目前它只是按照最初通过文件名创建的方式对其进行排序。阅读stackoverflow建议我应该尝试使用自定义比较器。我一直在看这个答案(How to sort GSON Array based on a key?),但它不适合我。

我有一个名为Tracks.class的自定义类,其中所有的getter和setter都设置了标题,艺术家,流派等等。

TrackFileManager.class是序列化程序,所有JsonObject.addProperty代码都在这里,并将jsonObject返回给MainActivity。

然后将此jsonObject添加到MainActivity中名为values的ArrayList中。 (listOfFiles是另一个包含我mp3的所有文件名的数组列表)

final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Track.class, new TrackFileManager());
gsonBuilder.setPrettyPrinting();
//diasableHtmlEscaping stops & turning into \u0026
final Gson gson = gsonBuilder.disableHtmlEscaping().create();

values = new ArrayList<String>();

for (String file : listOfFiles){
    t = new Track(path,file);
    values.add(gson.toJson(t));
}
Collections.sort(values, new MyJSONComparator());

我拥有的其他代码是MyJSONComparator.class,位于

之下
public class MyJSONComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
}

这不产生任何错误,但它没有排序,我知道它不会,但它唯一的方法是它不提示Android Studio中的错误。如果我将代码更改为implements Comparator<Track>,则Collections.sort会产生错误。除非我有比较器我不能访问我想要排序的元素,如s1.getArtist等,除非那不是正确的方法吗?我也尝试了ArrayList<String>和几乎所有其他类型的组合,除了那个有效的组合。

我显然做错了什么,我很确定我几乎就在那里。 任何人都可以帮助或至少指出我正确的方向吗?

修改

public class MyJSONComparator implements Comparator<Track> {
    @Override
    public int compare(Track s1, Track s2) {
        return s1.artist.compareTo(s2.artist);
    }
}

上述代码导致Collections.sort(values,new MyJSONComparator());错误。

Sort (List<String>, java.util.Comparator<? super java.lang.string> in Collections cannot be applied to ArrayList<String>, com.example.MyJSONComparator.

2 个答案:

答案 0 :(得分:0)

您的比较功能应将对象作为输入

@Override
public int compare(Object s1, Object s2) {
    return s1.artist.compareTo(s2.artist);
}

Collection.sort将在列表上工作,具有实现相同比较器接口的对象。

参考以下链接 http://www.programcreek.com/2011/12/examples-to-demonstrate-comparable-vs-comparator-in-java/

答案 1 :(得分:0)

晚安睡眠有什么不同。 我不知道为什么我认为我需要在程序中使用Json。我显然不这样做。 在程序中我创建了一个Tracks列表,然后将它们转换为json字符串,然后尝试在其中一个元素上对json进行排序。为什么不在其中一个元素上对track类进行排序。

DERP。

现在它位于Track类中,由Collections.sort(tracks)触发。轨道的实例是使用setter通过另一种方法构建的,就像我在Gson相关代码中所做的.addproperty一样。

@Override
public int compareTo(Track t) {
    return this.artist.compareTo(t.artist);
}