【问题标题】:Sorting an arraylist of jsonobjects on a particular json element对特定 json 元素上的 jsonobjects 数组列表进行排序
【发布时间】:2014-12-13 21:51:35
【问题描述】:

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

{
 "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 和 setter 都设置了标题、艺术家、流派等

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

这个 jsonObject 然后被添加到一个名为 values 的 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&lt;Track&gt;Collections.sort 会产生错误。除非我有比较器,否则我无法访问我想要排序的元素,例如s1.getArtist 等,除非那不是正确的方法?我也尝试过ArrayList&lt;String&gt; 以及几乎所有其他类型的组合,但有效的组合除外。

我显然做错了什么,我很确定我快到了。 任何人都可以帮助或至少为我指明正确的方向吗?

编辑

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&lt;String&gt;, java.util.Comparator&lt;? super java.lang.string&gt; in Collections cannot be applied to ArrayList&lt;String&gt;, com.example.MyJSONComparator.

【问题讨论】:

    标签: java android json arraylist gson


    【解决方案1】:

    睡个好觉有什么不同。 我不确定为什么我认为我需要在程序中使用 Json。我显然没有。 在程序中,我创建了一个曲目列表,然后将它们转换为 json 字符串,然后尝试根据其中一个元素对 json 进行排序。为什么不只根据其中一个元素对轨道类进行排序。

    呸。

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

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

    【讨论】:

      【解决方案2】:

      您的比较函数应该将对象作为输入

      @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/

      【讨论】:

      • 以下对象的 pojo 类是什么? {“文件名”:“somefile.mp3”“艺术家”:“艺术家1”“标题”:“标题1”“流派”:“摇滚”} TrackFileManager? ....如果是,那么这应该在你的列表中,这是应该实现 Comparator 的类
      • 它是一个 Gson 基于 Tracks 类创建的 JsonObjects 的数组列表。所以 POJO 就是 Tracks。 TrackFileManager 是创建 json 的序列化程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多