Java树集按值排序对象

Java树集按值排序对象,java,swing,sorting,treeset,Java,Swing,Sorting,Treeset,我昨天发布了这个应用程序,但现在我遇到了一个不同的问题。我目前正在开发这个应用程序,用于跟踪track(tracking track?)日跑步和显示排行榜。这是一个类,所以我不需要寻找代码,只是一些关于如何进行的想法。无论如何,应用程序当前将获取输入信息(从底部文本字段),创建RaceEntrant对象的树集(如下所示的类),并在右侧创建一个队列,当参与者完成跑步时,该队列将清空。问题是,我需要树集在(灰色)排行榜区域从最小到最大的运行时间进行排序,并在顶部输入时间时进行更新。我有点不确定如何让

我昨天发布了这个应用程序,但现在我遇到了一个不同的问题。我目前正在开发这个应用程序,用于跟踪track(tracking track?)日跑步和显示排行榜。这是一个类,所以我不需要寻找代码,只是一些关于如何进行的想法。无论如何,应用程序当前将获取输入信息(从底部文本字段),创建RaceEntrant对象的树集(如下所示的类),并在右侧创建一个队列,当参与者完成跑步时,该队列将清空。问题是,我需要树集在(灰色)排行榜区域从最小到最大的运行时间进行排序,并在顶部输入时间时进行更新。我有点不确定如何让它专门按照运行时对对象进行排序。感谢您的帮助

参赛者类别

class RaceEntrant
{
  private String name,
                 car;
  private double runTime;

  public RaceEntrant(String name, String car)
  {
    this.name = name;
    this.car = car;
  }    

  public String getName()
  {
    return name;
  }

  public String getCar()
  {
    return car;
  }   

  public double getTime()
  {
    return runTime;  
  }

  public void setTime(double time)
  {
      this.runTime = time;
  }

  @Override
  public String toString() 
  {
      StringBuilder sb = new StringBuilder("");
      sb.append(getName());
      sb.append("     ");
      sb.append(getCar());
      sb.append("\n" );
      sb.append("Best time: " + getTime() + "\n");
      return sb.toString();
  }
} 
这是当前操作的一个示例-参赛者按其参赛顺序显示,而不是按任何排序。我为这篇冗长的文章道歉。

我猜
树集
不是正确的数据结构。
TreeSet
首先是一个
Set
——根据比较,哪些键被认为是唯一的

我想你可以有相同的运行时间


也许只需使用
ArrayList
并使用
Collections.sort()
和自定义的
比较器对其进行排序
您的类RaceEntrant应该实现Comparable,并且您可以控制实现方法compareTo中的顺序

您的类可以如下所示:

class RaceEntrant implements Comparable<RaceEntrant>
{
  private final String name,
                 car;
  private double runTime;

  public RaceEntrant(final String name, final String car)
  {
    this.name = name;
    this.car = car;
  }

  public String getName()
  {
    return name;
  }

  public String getCar()
  {
    return car;
  }

  public double getTime()
  {
    return runTime;
  }

  public void setTime(final double time)
  {
      this.runTime = time;
  }

  @Override
  public String toString()
  {
      final StringBuilder sb = new StringBuilder("");
      sb.append(getName());
      sb.append("     ");
      sb.append(getCar());
      sb.append("\n" );
      sb.append("Best time: " + getTime() + "\n");
      return sb.toString();
  }

@Override
public boolean equals(final Object obj) {
    if(this == obj) return true;
    if (obj instanceof RaceEntrant){
    return (((RaceEntrant) obj).getTime() == runTime) && ((RaceEntrant) obj).getName().equals(name) && ((RaceEntrant) obj).getCar().equals(car);
    }
    return false;
}

@Override
public int hashCode() {
    return new Double(runTime).intValue();
}

@Override
public int compareTo(final RaceEntrant o) {
    return new Double(o.runTime).compareTo(this.runTime)*-1;
}
}
class RaceEntrant实现可比性
{
私有最终字符串名,
汽车
私有双运行时;
公众参赛者(最终车组名称、最终车组)
{
this.name=名称;
这辆车;
}
公共字符串getName()
{
返回名称;
}
公共字符串getCar()
{
返回车;
}
公共双getTime()
{
返回运行时;
}
公共无效设置时间(最终加倍时间)
{
this.runTime=时间;
}
@凌驾
公共字符串toString()
{
最终StringBuilder sb=新StringBuilder(“”);
sb.append(getName());
某人加上(“”);
某人附加(getCar());
某人附加(“\n”);
sb.append(“最佳时间:+getTime()+”\n”);
使某人返回字符串();
}
@凌驾
公共布尔等于(最终对象obj){
如果(this==obj)返回true;
if(参赛者的obj实例){
返回(((参赛者)obj.getTime()==运行时)和((参赛者)obj.getName().equals(name)和((参赛者)obj.getCar().equals(car);
}
返回false;
}
@凌驾
公共int hashCode(){
返回新的Double(运行时).intValue();
}
@凌驾
公共int比较(最终参赛者o){
返回新的Double(o.runTime).compareTo(this.runTime)*-1;
}
}

在参赛者课程中:

class RaceEntrant implements Comparable<RaceEntrant>{
  //..

  public int compareTo(RaceEntrant re){
    return getTime().compareTo(re.getTime());
  }

  @Override   //optional for Sets
  public boolean equals(Object o){
    If(o != null && o instanceOf RaceEntrant){
      RaceEntrant entrant = (RaceEntrant)o;
      return getName().equals(entrant.getName() &&
             getCar().equals(entrant.getCar()) &&
             getTime() == entrant.getTime();
    }
  }
}
class RaceEntrant实现可比性{
//..
公共int比较(参赛者re){
返回getTime().compareTo(re.getTime());
}
@覆盖//对于集合是可选的
公共布尔等于(对象o){
如果(o!=null&&o参赛者的实例){
参赛选手=(参赛选手)o;
返回getName().equals(entrant.getName())&&
getCar().equals(entrant.getCar())&&
getTime()==entrant.getTime();
}
}
}
然后可以按运行时对列表(可能是ArrayList)进行排序。
如果可能的话,你也可以使用树集(应该自动排序)在runTime+name+car上定义一个equals方法。

Ah,我还没有考虑过相同运行时间的可能性。谢谢,我来看看ArrayList是如何运行的。