Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种简单的方法可以用这种方式对arraylist进行排序?_Java_Sorting_Collections_Arraylist - Fatal编程技术网

Java 有没有一种简单的方法可以用这种方式对arraylist进行排序?

Java 有没有一种简单的方法可以用这种方式对arraylist进行排序?,java,sorting,collections,arraylist,Java,Sorting,Collections,Arraylist,我想知道是否有一种方法可以对自定义对象的Arraylist进行排序,以适应下面解释的情况?我假设我必须编写一个自定义比较器 假设我有一个如下所示的对象类: public class Person { private String status; //options: Online, Away, Offline private String name; //Person's name private Date date; //Last sign

我想知道是否有一种方法可以对自定义对象的Arraylist进行排序,以适应下面解释的情况?我假设我必须编写一个自定义比较器

假设我有一个如下所示的对象类:

public class Person {
    private String status;    //options: Online, Away, Offline
    private String name;      //Person's name
    private Date date;        //Last signed on

    //basic constructor
    public Person() {
        //set default values
    }

    //constructor to set all variables
    public Person(String s, String n, Date d) {
        status = s;
        name = n;
        date = d;
    }

    //setters & getters for each of the fields
}
 public class CompositePersonComparator implements Comparator<Person> {    
    @Override
    public int compare(Person a, Person b) {
       //1st and foremost - see if they are not of the same status.
       int statusComparison = a.getStatus().compareTo(b.getStatus());
       if (statusComparison!=0) return statusComparison;
       //logical else - same status, sort by name
       return a.getName().compareTo(b.getName());
    }
 }
基于名称和日期的排序应该相当容易。但是,我想知道如何根据状态进行排序?我希望能够根据此人当前是否在线以及谁离线对数组进行排序。我不太关心谁不在

上面的类只是一个示例类。我的实际类有一个JLabel,它根据状态设置了一个图标。
setText()。我想到了一种可能性,将标签设置为0、1和2的值,并且只使用一个典型的整数比较器,但我不确定这是否是一种建议的方法


当然,我在这里遗漏了一个明显的解决方案,所以也许一个评论或链接可以提供必要的信息。我知道Sort Arraylist上有很多“Sort Arraylist”线程,我已经浏览了很多。大多数只是按字母顺序或整数排序。

如果我理解正确,你基本上想按两个字段排序-主要字段是状态(因此相同状态的人聚在一起),然后,在每个具有相同状态的人中,按姓名排序

执行此操作的比较器如下所示:

public class Person {
    private String status;    //options: Online, Away, Offline
    private String name;      //Person's name
    private Date date;        //Last signed on

    //basic constructor
    public Person() {
        //set default values
    }

    //constructor to set all variables
    public Person(String s, String n, Date d) {
        status = s;
        name = n;
        date = d;
    }

    //setters & getters for each of the fields
}
 public class CompositePersonComparator implements Comparator<Person> {    
    @Override
    public int compare(Person a, Person b) {
       //1st and foremost - see if they are not of the same status.
       int statusComparison = a.getStatus().compareTo(b.getStatus());
       if (statusComparison!=0) return statusComparison;
       //logical else - same status, sort by name
       return a.getName().compareTo(b.getName());
    }
 }
公共类CompositePersonComparator实现比较器{
@凌驾
公共整数比较(人员a、人员b){
//首先,也是最重要的一点——看看他们的地位是否不同。
int statusComparison=a.getStatus().comparieto(b.getStatus());
如果(statusComparison!=0)返回statusComparison;
//逻辑else-相同状态,按名称排序
返回a.getName().compareTo(b.getName());
}
}

在这里使用枚举很有用
enum MyEnum{ONLINE,AWAY,OFFLINE;}

我建议将状态处理为枚举数据类型,而不是只能是少数字符串之一的字符串。这使得编写可读的compareTo方法变得容易:

public class Person implements Comparable<Person> {
  private Status currentStatus;   
  private String name;      //Person's name
  private Date date;        //Last signed on

  enum Status {ONLINE, AWAY, OFFLINE};

  //basic constructor
  public Person()  {
     //set default values
  }

  //constructor to set all variables
  public Person(Status s, String n, Date d) {
     currentStatus = s;
     name = n;
     date = d;
  }

 /**
  *   Order the Persons first by status where all ONLINE Persons are listed first.
  */
  @Override
  public int compareTo(Person other) {
     if(other.currentStatus == currentStatus)
        return name.compareTo(other.name);

     return currentStatus.ordinal() - other.currentStatus.ordinal();
  }
}   
公共类人员实现可比较{
私人身份;
私有字符串名称;//人名
私人日期日期;//上次登录日期
枚举状态{联机、离开、脱机};
//基本构造
公众人士(){
//设置默认值
}
//构造函数设置所有变量
公众人物(状态s,字符串n,日期d){
当前状态=s;
name=n;
日期=d;
}
/**
*按状态首先订购人员,其中所有在线人员都列在第一位。
*/
@凌驾
公共int比较(其他人){
if(other.currentStatus==currentStatus)
返回name.compareTo(其他.name);
返回currentStatus.ordinal()-其他.currentStatus.ordinal();
}
}   

Status可能应该是一个Enum。请参阅javadoc,了解编写comparator后如何排序的集合:@mrhobo我将读入Enum。对于枚举,我假设我会给它们赋值,并根据整数值进行排序?Nattyddubbs,我正在阅读链接。这个问题没有意义的是,没有“自然”的状态排序,除非您使用
字符串
排序,其中
在线
离线
远离
。使用
Enum
可以在对象中定义它们的顺序,或者只需在Enum声明中将它们按所需的“顺序”放置即可。@nattyddubbs哇,我不知道在Enum中将它们按所需的顺序放置会自动这样定义。我显然需要仔细阅读枚举。非常感谢。我为我的无知道歉。你确实理解我的要求。谢谢你的例子,如果你不介意的话,你能解释一下它是如何排序的吗?我如何知道它是在线、离线还是异地排序?@WilliamShatner-它依赖于所有涉及的属性与它们自身的可比性。整数、字符串和大多数内置项都是。如果您按照上面的建议将状态设置为一个枚举,那么you可以通过依赖内置的枚举比较(按照写入顺序)使其实现可比较。字符串按字母顺序比较。compare()方法返回的值为0表示相等-请将a.compareTo(b)视为与Math中的a-b“相似”。谢谢您的解释。我相信上面的例子只会按字母顺序对字符串排序。因此,我确实需要使用枚举(如Thorn所示),这可能是对这个问题的一个很好的回答。然而,您可能想进一步说明这是如何工作的。这确实是对这个问题的一个很好的回答。不过我同意安德鲁的观点,我对Enum了解不多,所以如果你像Thorn那样扩展它,那就太好了+尽管你是对的。谢谢你举了一个优雅的例子。你完全正确。我现在需要改变我的类和使用这个变量的类的结构。