【问题标题】:Sorting List of objects based on a field within a List in the List of objects根据对象列表中的列表中的字段对对象列表进行排序
【发布时间】:2014-02-21 20:12:22
【问题描述】:

我有两个具有以下结构的对象:

public class Event{
    private String name;
    private int id;
    private List<Tags> tags;
}

public class Tags{
    private String tagName;
    private int rank;
}

我有一个Event 对象列表

 List<Event> events = new ArrayList<Event>();

我想根据Tags 对象中的排名对事件进行排序。

例如,

 Tags tag1 = new Tags("web", 1);
 Tags tag2 = new Tags("mobile", 7);
 List<Tags> tags = new ArrayList<Tags>();
 tags.add(tag1);
 tags.add(tag2);
 Event event1 = new Event("test1",4242432, tags);

 Tags tag3 = new Tags("web", 2);
 Tags tag4 = new Tags("mobile", 8);
 List<Tags> tags1 = new ArrayList<Tags>();
 tags.add(tag3);
 tags.add(tag4);
 Event event2 = new Event("test2",546423, tags1);

所以现在我想根据Tags 对象中的排名字段对这两个事件进行排序。由于标签是一个ArrayList,因此可以有多个等级,所以我想传递一个参数tagName,它将决定在不同的Tags 对象中比较哪些等级。

【问题讨论】:

  • 这就是Comparator 接口的用途。实现一个Comparator&lt;Event&gt;,在比较两个Event 对象时返回-1、0 或1。但是,您必须根据Tags 对象中的排名字段来确定 的含义。每个Event 可能包含多个Tags 对象。另外,我们不会为您编写它。发布您到目前为止所写的内容。
  • 实现自定义排序算法。
  • @nikpon 这在 Java 中是一个非常糟糕的建议。简单地实现 Comparator 更加标准,可能更少的错误,更少的测试。
  • @nikpon 好的,可能性能也较差,但这也需要测试。所以我仍然不建议使用自定义排序算法。这不是 O(1) 排序算法的用例之一。
  • @nikpon 这里的问题是“如何编写一些代码来基于一些tagName 比较两个Event 对象”?而不是“如何对Event 的列表进行排序?......要执行任何类型的排序,您首先应该有一种方法来比较两个相似的对象。使用哪种排序算法是下一个问题。

标签: java arrays sorting comparator comparable


【解决方案1】:

使用java.lang.Comparator接口。

public class EventComparator implements Comparator<Event> {

    private String tagName;

    public EventComparator(String tagName) {
        this.tagName = tagName;
    }

    @Override
    public int compare(Event e1, Event e2) {
        Tag t1 = getTag(e1, tagName); // getTag(...) returns the e1's tag with name 'tagName'
        Tag t2 = getTag(e2, tagName);

        // Ignoring null check for brevity
        if (t1.getRank() > t2.getRank())
            return 1;
        else if (t1.getRank() < t2.getRank())
            return -1;
        else
            return 0;
    }
}

用法:

Collections.sort(eventsList, new EventComparator("web"));
Collections.sort(eventsList, new EventComparator("mobile"));

【讨论】:

  • 可能基于多个标签的优先级也可能有意义。但这很容易实现。
  • 这样的答案真的很好看。简短、简单、切中要害。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2016-08-06
  • 1970-01-01
  • 2016-11-03
相关资源
最近更新 更多