【问题标题】:How to sort an object array based on one property of objects when another property has same values?当另一个属性具有相同的值时,如何根据对象的一个​​属性对对象数组进行排序?
【发布时间】:2015-01-10 15:10:44
【问题描述】:

我有一个如下的对象数组。

[obj1 obj2 obj3 ...]

数组中的每个对象都有属性 date (java.util.Date) 和 name (String)。

obj1.date = new Date(); obj1.name = "A";

数组中的对象已经根据日期排序。多个对象可以具有相同的日期值。

现在,如果对象具有相同的日期,我想根据对象名称对对象数组进行排序。更清楚地说,如果所有对象的日期不同,则对象的顺序不应该有任何变化。如果对象具有相同的日期,则仅根据名称对这些对象进行排序。请注意,当前数组已经根据日期排序。

例如,我有以下数组 [obj1,obj2,obj3,obj4]

obj1.name = "B"; obj1.date = 2014 年 7 月 1 日星期二 00:00:00 IST;

obj2.name = "D"; obj2.date = 2014 年 7 月 3 日星期四 00:00:00 IST;

obj3.name = "A"; obj3.date = 2014 年 7 月 3 日星期四 00:00:00 IST;

obj4.name = "C"; obj4.date = Sun Jul 06 00:00:00 IST 2014;

排序后的数组应该是[obj1,obj3,obj2,obj4]

【问题讨论】:

    标签: java sorting


    【解决方案1】:

    Smutje 为您提供了如何在 Java 5 到 7 中执行此操作的答案。使用 Java8,您可以使用函数式接口和 lambda 表达式。所以你的排序方法会减少到

    Arrays.sort(objectArray, Comparator.<YourObject>comparing(YourObject::getDate)
            .thenComparing(YourObject::getString));
    

    【讨论】:

    • 随着我对 Java 8 的了解不断提高,非常感谢您提供这个简洁的解决方案!
    【解决方案2】:

    写一个Comparator&lt;YourObject&gt;,它首先比较日期,如果日期相等,则比较名称并对数组进行排序

    示例

    你的对象

    public class YourObject {
    
        private Date date;
    
        private String string;
    
        public Date getDate() {
            return date;
        }
    
        public void setDate(Date date) {
            this.date = date;
        }
    
        public String getString() {
            return string;
        }
    
        public void setString(String string) {
            this.string = string;
        }
    }
    

    排序

    Arrays.sort(new YourObject[]{}, new Comparator<YourObject>() {
    
            @Override
            public int compare(YourObject o1, YourObject o2) {
                final int dateComparisonResult = o1.getDate().compareTo(o2.getDate());
                final int yourObjectComparisonResult;
    
                if (dateComparisonResult == 0) {
                    yourObjectComparisonResult = o1.getString().compareTo(o2.getString());
                } else {
                    yourObjectComparisonResult = dateComparisonResult;
                }
    
                return yourObjectComparisonResult;
            }
        });
    

    【讨论】:

      【解决方案3】:
      Object[] obj = {obj1,obj2,obj3};
      

      你的数组是这样的

      您只需将其转换为 `java.util.List` ,因为它具有有用的 API(类和接口),因此您可以轻松访问该 API,而不是自己编写繁琐的代码

      第一步:List l = Arrays.asList(obj);


      一旦获得 List 的引用,就可以使用 `Collections.sort(Collection)` 对列表进行排序

      第二步:点赞,Collections.sort(l);


      如果您想要自己的排序技术,例如按日期或按名称 你只需使用java.util.Comparator 接口

      例如,按名称排序代码 sn-p 像这样,


      class ByName implements Comparator<String>{
      
          @Override
          public int compare(String str1, String str2) {
              // TODO Auto-generated method stub
              if(str1.length > str2.length)
                 return 1;
              else
                 return -1;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 2011-09-09
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多