Java TreeSet按值排序对象

时间:2014-05-19 13:37:41

标签: java swing sorting treeset

我昨天发布了这个应用程序,但现在我遇到了不同的问题。我目前正在开发此应用程序,用于跟踪跟踪(跟踪跟踪?)日运行和显示排行榜。这是一个课程,所以我不是必须寻找代码,只是一些关于如何去做的想法。无论如何,应用程序当前将获取输入信息(来自底部文本字段),创建RaceEntrant对象的TreeSet(下面显示的类),并在右侧创建一个队列,当参与者通过他们的运行时清空该队列。问题是,我需要TreeSet在(灰色)排行榜区域中从最小到最大runTime进行排序,并在顶部输入时更新。我有点不确定如何使用runTime对对象进行排序。任何帮助表示赞赏。

RaceEntrant Class

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();
  }
} 

这是当前操作的一个示例 - RaceEntrant(s)按其运行顺序显示,未按任何顺序排序。我为冗长的帖子道歉。 app example

3 个答案:

答案 0 :(得分:1)

您的类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;
}
}

答案 1 :(得分:1)

在您的RaceEntrant类中:

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();
    }
  }
}

然后您可以通过runTime对List(可能是ArrayList)进行排序。 您也可以使用TreeSet(这应该自动排序)并在runTime + name + car上定义一个equals方法,如果这可能是一种方法。

答案 2 :(得分:0)

我猜TreeSet不是正确的数据结构。 TreeSet首先是Set - 根据比较,这些密钥被视为唯一。

我认为你可以有相同的运行时间?

也许只需使用ArrayList并使用自定义Collections.sort() Comparator对其进行排序。