两个表达式上的Java排序集合

两个表达式上的Java排序集合,java,sorting,Java,Sorting,我有一节课 public class User { String country; Double rating; Double status; } 我需要根据两个条件对这个类的列表进行排序 列表的开头必须是对国家/地区具有一定价值的用户。这些用户根据评级进行排序。如果评级相同,则比较状态 若用户对country有另一个值,只需根据评级对其排序 我尝试了很多次,这是最近的一次: final String country = me.getCountry(); Coll

我有一节课

public class User {

    String country;
    Double rating;
    Double status;
}
我需要根据两个条件对这个类的列表进行排序

列表的开头必须是对国家/地区具有一定价值的用户。这些用户根据评级进行排序。如果评级相同,则比较状态

若用户对country有另一个值,只需根据评级对其排序

我尝试了很多次,这是最近的一次:

 final String country = me.getCountry();
 Collections.sort(usersArray, new Comparator<User>() {
            @Override
            public int compare(User lhs, User rhs) {
                User user1 = lhs.getUser();
                String country1 = user1.getCountry();

                int result = country.equals(country1) ? 1 : 0;

                if (result == 0) {
                    result = Double.compare(lhs.rating, rhs.rating);
                    if (result == 0) {
                        return Double.compare(lhs.status, rhs.status);
                    } else
                        return result;
                }
                return Double.compare(lhs.rating, rhs.rating);
            }
        });
final String country=me.getCountry();
Collections.sort(usersArray,newcomparator(){
@凌驾
公共整数比较(用户lhs、用户rhs){
User user1=lhs.getUser();
字符串country1=user1.getCountry();
int结果=国家。等于(国家1)?1:0;
如果(结果==0){
结果=双重比较(左侧额定值、右侧额定值);
如果(结果==0){
返回双重比较(左侧状态、右侧状态);
}否则
返回结果;
}
返回双比较(左侧额定值、右侧额定值);
}
});
具有其他国家/地区值的用户,而不是我的-位于顶部

这是因为如果国家相等,则返回1;否则,您将检查评级/状态。如果其中一个比较返回1,那么比较器也返回1。所以国家不平等,但来自非您国家的用户有更高的评级和比较回报1。这就是列表未正确排序的原因

int result = country.equals(country1) ? 1 : 0; // DEBUG result = 0 

if (result == 0) { # DEBUG enter
    result = Double.compare(lhs.rating, rhs.rating); // DEBUG result = 1
    if (result == 0) {
        result = Double.compare(lhs.status, rhs.status);
    } else
        return result; // this could be omitted
}

return result; // DEBUG method return 1.

编辑后:

您必须指定所有可能的情况:

  • 国家/地区可以是您的,也可以不是(2种情况)
  • 评级可以更高、相等、更低(3种情况)
  • 状态可以是更高、相等、更低(3种情况)
  • 如果我计算正确(概率不是我最强的一面),你有18种情况

    具有其他国家/地区值的用户,而不是我的-位于顶部

    这是因为如果国家相等,则返回1;否则,您将检查评级/状态。如果其中一个比较返回1,那么比较器也返回1。所以国家不平等,但来自非您国家的用户有更高的评级和比较回报1。这就是列表未正确排序的原因

    int result = country.equals(country1) ? 1 : 0; // DEBUG result = 0 
    
    if (result == 0) { # DEBUG enter
        result = Double.compare(lhs.rating, rhs.rating); // DEBUG result = 1
        if (result == 0) {
            result = Double.compare(lhs.status, rhs.status);
        } else
            return result; // this could be omitted
    }
    
    return result; // DEBUG method return 1.
    

    编辑后:

    您必须指定所有可能的情况:

  • 国家/地区可以是您的,也可以不是(2种情况)
  • 评级可以更高、相等、更低(3种情况)
  • 状态可以是更高、相等、更低(3种情况)
  • 如果我计算正确(概率不是我最强的一面),你有18种情况。

    考虑使用from。您告诉它哪些字段要按哪个顺序进行比较,其余的由它进行。你的代码也少了

         return new CompareToBuilder()
           .append(lhs.country, rhs.country)
           .append(lhs.rating, rhs.rating)
           .append(lhs.status, rhs.status)
           .toComparison();
       }
    
    考虑使用from。您告诉它哪些字段要按哪个顺序进行比较,其余的由它进行。你的代码也少了

         return new CompareToBuilder()
           .append(lhs.country, rhs.country)
           .append(lhs.rating, rhs.rating)
           .append(lhs.status, rhs.status)
           .toComparison();
       }
    

    使用来自Java 8的流,您可以执行以下操作:

    Arrays.stream(usersArray)
          .sorted((lhs, rhs) -> Double.compare(lhs.status, rhs.status))
          .sorted((lhs, rhs) -> Double.compare(lhs.rating, rhs.rating))
          .toArray(size -> new User[size])
    
    由于数组的结果流是有序的,因此Java保证排序是稳定的。这意味着当评级相等时,状态顺序保持稳定。这就是为什么我先按地位排序,然后按评级排序


    顺便说一下,这种方法不会改变原始数组的顺序。它返回一个新的流。

    使用来自Java 8的流,您可以执行以下操作:

    Arrays.stream(usersArray)
          .sorted((lhs, rhs) -> Double.compare(lhs.status, rhs.status))
          .sorted((lhs, rhs) -> Double.compare(lhs.rating, rhs.rating))
          .toArray(size -> new User[size])
    
    由于数组的结果流是有序的,因此Java保证排序是稳定的。这意味着当评级相等时,状态顺序保持稳定。这就是为什么我先按地位排序,然后按评级排序


    顺便说一下,这种方法不会改变原始数组的顺序。它返回一个新的集合。

    并非所有集合实现都可以订购为什么对int值使用Double.compare()?int result=country.compareTo(country1==null?“zzzzzz”:country1);这似乎不正确。你说你想让你的国家的人成为最高层。这将按字母顺序对列表进行排序。正确执行,这应该是
    int result=country.equals(country1)?1 : 0;@Kami是一个伪代码。在实际代码中是双值的。
    Collections.sort(usersArray,new Comparator()
    。ExpertData不是应该是“new Comparator”吗?不是所有的集合实现都是/都可以排序为什么对int值使用double.compare()?int result=country.compareTo(country1==null?“zzzzzzzz”:country1);这似乎不正确。您声明希望您所在国家的人排在首位。这将按字母顺序对列表进行排序。正确实现后,这应该是
    int result=country.equals(country1)?1:0;
    @Kami是伪代码。在实际代码中是双值。
    Collections.sort(usersArray,new Comparator()
    。ExpertData不应该是“新的比较器”吗?