【问题标题】:How to order a unique list based on 2 object attributes in Java如何根据 Java 中的 2 个对象属性对唯一列表进行排序
【发布时间】:2012-05-17 23:04:25
【问题描述】:

我有一个我称之为工件的对象列表。我需要按“名称”属性的字母顺序和 Artifact 称为“级别”的属性按数字顺序排序。

级别并不总是在 Artifact 中设置,在这种情况下,整个集合应该按字母顺序排列。如果 Artifact 有一个 Level,那么优先级应该按 Level 的顺序排序。

工件需要基于名称属性是唯一的。我可以使用 Set 集合并覆盖 Artifact 的 equals 方法以按字母顺序排序。但是,当我想按Level进行排序时,与Name相关的equals方法会抛出这种排序的结果。

我应该使用什么集合和对象结构来保持名称的唯一性,同时还能按级别排序?

【问题讨论】:

  • 你应该举一些例子来说明清楚。
  • 那么如果你有 200 万个对象,而最后一个没有级别,你想对整个集合进行排序吗?

标签: java sorting collections unique


【解决方案1】:

您需要查看comparable interfacecomparator interface。如果这是可以比较对象的唯一方法,则实现 Comparable,否则实现比较器。

【讨论】:

    【解决方案2】:

    我认为java.util.TreeSet 是解决您问题的好容器。它是 Set 并且它使用 Compareble 机制。

    所以你有两个选择:

    1) 将 Comparator 放入 TreeSet 构造函数中

    2) 让您的 Artifact 实现 Comparable

    提示:在 compareTo 方法中,您可以使用 String 中的 compareTo 方法。

    【讨论】:

      【解决方案3】:

      下面的代码将对集合进行排序,优先考虑级别,然后是名称。如果一个级别为空,它将被放置在开头,将其视为级别 0。对于 null 名称,工件将被定位为它有一个空级别。希望对您有所帮助。

      import java.util.Arrays;
      import java.util.SortedSet;
      import java.util.TreeSet;
      
      public class Artifact implements Comparable<Artifact> {
      
      private String name;
      private Integer level;
      
      public Artifact(String name, Integer level) {
          this.name = name;
          this.level = level;
      }
      
      @Override
      public int hashCode() {
          final int prime = 31;
          int result = 1;
          result = prime * result + ((level == null) ? 0 : level.hashCode());
          result = prime * result + ((name == null) ? 0 : name.hashCode());
          return result;
      }
      
      @Override
      public boolean equals(Object obj) {
          if (this == obj)
              return true;
          if (obj == null)
              return false;
          if (getClass() != obj.getClass())
              return false;
          Artifact other = (Artifact) obj;
          if (level == null) {
              if (other.level != null)
                  return false;
          } else if (!level.equals(other.level))
              return false;
          if (name == null) {
              if (other.name != null)
                  return false;
          } else if (!name.equals(other.name))
              return false;
          return true;
      }
      
      @Override
      public int compareTo(Artifact o) {
          if (level == null){
              return new Artifact(name, 0).compareTo(o);
          }
      
          if (name == null){
              return new Artifact("", level).compareTo(o);
          }
      
          if (level.equals(o.level)) {
              return name.compareTo(o.name);
          } else {
              return level.compareTo(o.level);
          }
      }
      
      public String toString() {
          return level + " " + name;
      }
      
      public static void main(String[] args) {
          Artifact a1 = new Artifact("a", 1);
          Artifact a2 = new Artifact("a", 2);
          Artifact a3 = new Artifact("a", 3);
          Artifact b1 = new Artifact("b", 1);
          Artifact b2 = new Artifact("b", 2);
          Artifact b2a = new Artifact("b", 2);
          Artifact nullLevel = new Artifact("a",null);
          Artifact nullName = new Artifact(null,2);
          SortedSet<Artifact> set = new TreeSet<Artifact>();
          set.add(a1);
          set.add(a2);
          set.add(a3);
          set.add(b1);
          set.add(b2);
          set.add(b2a);
          set.add(nullLevel);
          set.add(nullName);
          System.out.println(Arrays.toString(set.toArray()));
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-11
        • 2022-01-05
        • 2012-11-12
        • 2019-06-30
        相关资源
        最近更新 更多