Java 使用自定义比较器的排序列表不工作

Java 使用自定义比较器的排序列表不工作,java,android,list,sorting,Java,Android,List,Sorting,我想根据三个标准对用户列表进行排序。 所以我创建了自定义比较器来对列表进行排序,但它并没有按我所希望的那样工作 public class CustomComparator implements Comparator { List<Integer> user1Time = new ArrayList<>(); List<Integer> user2Time = new ArrayList<>(); int user1Count

我想根据三个标准对用户列表进行排序。 所以我创建了自定义比较器来对列表进行排序,但它并没有按我所希望的那样工作

public class CustomComparator implements Comparator {
    List<Integer> user1Time = new ArrayList<>();
    List<Integer> user2Time = new ArrayList<>();
    int user1Count, user2Count;
    ParseUser user1, user2;
    Date user1Date, user2Date;
    boolean user1Short, user2Short;
    private String TAG="CustomComparator";

    @Override
    public int compare(Object lhs, Object rhs) {
        user1 = (ParseUser) lhs;
        user2 = (ParseUser) rhs;


        user1Time = user1.getList("timeAvailable");
        user2Time = user2.getList("timeAvailable");


        //To compare Available time of both users with Searched Time

        if(user1Time!=null){
            user1Time.retainAll(Utils.availableTime);
            user1Count = user1Time.size();
        }else{
            user1Count=0;
        }

        if(user2Time!=null){
            user2Time.retainAll(Utils.availableTime);
            user2Count = user2Time.size();
        }else{
            user2Count=0;
        }



        Log.d(TAG, "compare: "+user1.getString("name")+" "+user1Count);
        Log.d(TAG, "compare: "+user2.getString("name")+" "+user2Count);



        //To compare lastSeen of both the users
        user1Date = user1.getDate("lastSeen");
        user2Date = user2.getDate("lastSeen");


        //To compare shortNotice avilablity of both the user
        user1Short = user1.getBoolean("shortNotice");
        user2Short = user2.getBoolean("shortNotice");

        if(user2Time!= null && user2Time!= null && user1Date!= null && user2Date!= null){
            if (user1Count>user2Count){
                if(user1Short){
                    if(user1Date.compareTo(user2Date)>0){
                        return -1;
                    }else {
                        return -1;
                    }
                }else if (user1Date.compareTo(user2Date)>0){
                    return -1;
                }else if (user2Date.compareTo(user1Date)>0){
                    return 1;
                }
            }else if(user2Short){
                if(user2Date.compareTo(user1Date)>0){
                    return 1;
                }else {
                    return -1;
                }
            }else if (user2Date.compareTo(user1Date)>0){
                return 1;
            }else if (user1Date.compareTo(user2Date)>0){
                return -1;
            }
        }
            return 0;
    }
}
公共类CustomComparator实现Comparator{
List user1Time=new ArrayList();
List user2Time=new ArrayList();
int user1Count,user2Count;
解析用户user1、user2;
日期user1Date,user2Date;
布尔user1Short,user2Short;
私有字符串标记=“CustomComparator”;
@凌驾
公共整数比较(对象lhs、对象rhs){
user1=(ParseUser)lhs;
user2=(ParseUser)rhs;
user1Time=user1.getList(“timeAvailable”);
user2Time=user2.getList(“timeAvailable”);
//将两个用户的可用时间与搜索时间进行比较
if(user1Time!=null){
user1Time.retainal(Utils.availableTime);
user1Count=user1Time.size();
}否则{
user1Count=0;
}
if(user2Time!=null){
user2Time.retainal(Utils.availableTime);
user2Count=user2Time.size();
}否则{
user2Count=0;
}
Log.d(标记“compare:”+user1.getString(“name”)+“+user1Count”);
Log.d(标记“compare:”+user2.getString(“name”)+“+user2Count”);
//比较两个用户的最新情况
user1Date=user1.getDate(“lastSeen”);
user2Date=user2.getDate(“lastSeen”);
//比较两个用户的短通知可用性
user1Short=user1.getBoolean(“短通知”);
user2Short=user2.getBoolean(“短通知”);
if(user2Time!=null&&user2Time!=null&&user1Date!=null&&user2Date!=null){
if(user1Count>user2Count){
if(user1Short){
如果(user1Date.compareTo(user2Date)>0){
返回-1;
}否则{
返回-1;
}
}如果(user1Date.compareTo(user2Date)>0,则为else{
返回-1;
}如果(user2Date.compareTo(user1Date)>0,则为else{
返回1;
}
}else if(user2Short){
如果(user2Date.compareTo(user1Date)>0){
返回1;
}否则{
返回-1;
}
}如果(user2Date.compareTo(user1Date)>0,则为else{
返回1;
}如果(user1Date.compareTo(user2Date)>0,则为else{
返回-1;
}
}
返回0;
}
}
但它不能正常工作

我想用三种方式对列表排序:整数数组、布尔值数组和日期数组
正如您在我的代码中所看到的。

您可以这样做:

class Data {
int A;
int B;
int C;

public int getA() {
    return A;
}

public void setA(int a) {
    A = a;
}

public int getB() {
    return B;
}

public void setB(int b) {
    B = b;
}

public int getC() {
    return C;
}

public void setC(int c) {
    C = c;
}
}

class Sorter {
public void sort(List<Data> dataList){
    Collections.sort(dataList,
            Comparator.comparingInt(Data::getA)
            .thenComparingInt(Data::getB)
            .thenComparingInt(data->data.C)
    );
}
}
类数据{
INTA;
int B;
INTC;
公共int getA(){
返回A;
}
公共无效setA(INTA){
A=A;
}
公共int getB(){
返回B;
}
公共休息室(内部b){
B=B;
}
公共int getC(){
返回C;
}
公共无效setC(INTC){
C=C;
}
}
分类机{
公共无效排序(列表数据列表){
Collections.sort(数据列表,
Comparator.comparingit(数据::getA)
.thenComparingInt(数据::getB)
.然后比较(数据->数据.C)
);
}
}

这里我只使用
比较int
,但您可以使用任何类型的比较器进行比较。

您可以这样做:

class Data {
int A;
int B;
int C;

public int getA() {
    return A;
}

public void setA(int a) {
    A = a;
}

public int getB() {
    return B;
}

public void setB(int b) {
    B = b;
}

public int getC() {
    return C;
}

public void setC(int c) {
    C = c;
}
}

class Sorter {
public void sort(List<Data> dataList){
    Collections.sort(dataList,
            Comparator.comparingInt(Data::getA)
            .thenComparingInt(Data::getB)
            .thenComparingInt(data->data.C)
    );
}
}
类数据{
INTA;
int B;
INTC;
公共int getA(){
返回A;
}
公共无效setA(INTA){
A=A;
}
公共int getB(){
返回B;
}
公共休息室(内部b){
B=B;
}
公共int getC(){
返回C;
}
公共无效setC(INTC){
C=C;
}
}
分类机{
公共无效排序(列表数据列表){
Collections.sort(数据列表,
Comparator.comparingit(数据::getA)
.thenComparingInt(数据::getB)
.然后比较(数据->数据.C)
);
}
}

这里我只使用
比较它
,但是你可以用任何类型的比较器来做。

但是它不能正常工作
定义不能正常工作。请使用
然后比较
你说的“不工作”是什么意思?你们能给我更详细的解释吗?我是说它是排序列表,但有时,时间更充裕的用户不会排在首位,即使他的短消息是真的。我希望用户有更好的三分之二标准或所有三个标准。如果时间可用性列表很小,我可以工作,但如果列表扩展超过10个项目,它不会work@YassinHajaj请给我举一些例子,比较
但它不能正常工作
定义不能
正常工作
。请使用
然后比较
你说的“不工作”是什么意思?你们能给我更详细的解释吗?我是说它是排序列表,但有时,时间更充裕的用户不会排在首位,即使他的短消息是真的。我希望用户有更好的三分之二标准或所有三个标准。如果时间可用性列表很小,我可以工作,但如果列表扩展超过10个项目,它不会work@YassinHajaj请给我举一些比较的例子