2014-10-18 33 views
1

我写了一些代码,使用Gson库创建json数据的数组列表,这看起来像这样。在特定的json元素上对jsonobjects的arraylist排序

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

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

我有一个名为Tracks.class自定义类具有所有getter和建立制定者拿着标题,艺术家,流派等

TrackFileManager.class是串行器,所有的JsonObject.addProperty代码并返回一个jsonObject返回到MainActivity。

这个jsonObject然后被添加到一个ArrayList中,在MainActivity中调用如下的值。 (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>以及几乎所有其他类型的组合,除此之外的其他组合。

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

EDIT

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.

回答

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/

+0

艺术家为红色,并说“不能解析符号” – zoonosis 2014-10-18 12:56:35

+0

这对于以下对象?? { POJO类‘文件名’:‘somefile.mp3’ ‘艺术家’:“artist1 “ ‘称号’:‘TITLE1’ ‘流派’:‘摇滚’ } TrackFileManager ....如果是,那么这应该在你的清单,这是应该实现比较 – 2014-10-18 13:08:21

+0

其GSON的ArrayList类?创建基于Tracks类的JsonObjects,所以POJO是Tracks,TrackFileManager是创建json的序列化程序。 – zoonosis 2014-10-18 13:12:05

0

一个良好的睡眠使什么区别。 我不知道为什么我认为我需要在程序中使用Json's。我显然不会。 在程序中创建一个轨道列表,然后将它们转换为json字符串,然后尝试对其中一个元素进行排序。为什么不直接对其中一个元素的轨道类进行排序呢?

Derp。

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

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