在Java中根据不同的数据成员对对象列表进行排序

3


I have this class:

public class Friend {

private String name;
private String location;
private String temp;
private String humidity;

public String getTemp() {
    return temp;
}

public void setTemp(String temp) {
    this.temp = temp;
}

public String getHumidity() {
    return humidity;
}

public void setHumidity(String humidity) {
    this.humidity = humidity;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}
}

我希望根据用户输入,按照名称、位置、温度和湿度对列表进行排序。
编辑:用户指定需要按哪个数据成员进行排序。
有什么最简单的方法可以做到这一点吗?
谢谢。


1
https://dev59.com/i1TTa4cB1Zd3GeqPwNq- - jmj
3个回答

6

因为你想按四个不同的标准对它们进行排序,所以实现Comparable接口没有意义。在这种情况下,你可以为每个排序参数创建不同的Comparators。然而,你可以为最合乎逻辑的排序字段(例如名称)实现Comparable接口。否则,使用比较器是一个好选择。

public class FriendNameComparator extends Comparator<Friend> {

    // assuming both are non-null for code simplicity; you may wish to change that
    public int compare(Friend f1, Friend f2) {
        return f1.getName().compareTo(f2.getName());
    }
}

public class FriendLocationComparator extends Comparator<Friend> {

    // assuming both are non-null for code simplicity; you may wish to change that
    public int compare(Friend f1, Friend f2) {
        return f1.getLocation().compareTo(f2.getLocation());
    }
}

// and so forth

然后,您可以使用Collections实用类的sort函数按给定比较器进行排序。
Collections.sort(friendsList, new FriendNameComparator()); // sorts by name
Collections.sort(friendsList, new FriendLocationComparator()); // sorts by location
// etc

5
Java有一个静态函数叫做Collections.sort(List, Comparator),它可以根据自定义的比较器对(通用化的)对象列表进行排序。比较器会给定两个相同类型的对象,并决定哪一个在先哪一个在后。
您的任务是编写一个函数,该函数创建一个Comparator,该比较器根据其参数和用户指定的排序顺序对对象进行排序。例如:
public Comparator<Friend> getComparator(final String sortBy) {
  if ("name".equals(sortBy)) {
    return new Comparator<Friend>() {
      @Override int compare(Friend f1, Friend f2) 
        return f1.getName().compareTo(f2.getName());
      }
    };
  } else if ("location".equals(sortBy)) {
    return new Comparator<Friend>() {
      @Override int compare(Friend f1, Friend f2) 
        return f1.getLocation().compareTo(f2.getLocation());
      }
    };
  } else if ("temp".equals(sortBy)) {
    // ...
  } else {
    throw new IllegalArgumentException("invalid sort field '" + sortBy + "'");
  }
}

1
List list=new ArrayList();

使用 if else if 来处理每个条件:

if(location ){
        Collections.sort(list, new Comparator () {
             public int compare(YourObject o1, YourObject o2) {
                    return o1.getLocation().compareTo(o2.getLocation());
                }

        });

    }

    } else if(temp ){

    ........
    }
    .......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接