2014-10-18 49 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); 
}