簡體   English   中英

Java TreeSet按值排序對象

[英]Java TreeSet sorting objects by value

我昨天發布了這個應用程序,但現在我遇到了另一個問題。 我目前正在開發此應用程序,用於跟蹤跟蹤(跟蹤跟蹤?)日運行和顯示排行榜。 這是一個類,所以我不是必須尋找代碼,只是一些關於如何去做的想法。 無論如何,應用程序當前將獲取輸入信息(來自底部文本字段),創建RaceEntrant對象的TreeSet(下面顯示的類),並在右側創建一個隊列,當參與者通過他們的運行時清空該隊列。 問題是,我需要TreeSet在(灰色)排行榜區域中從最小到最大runTime進行排序,並在頂部輸入時更新。 我有點不確定如何通過runTime對對象進行排序。 任何幫助表示贊賞。

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

這是當前操作的一個示例 - RaceEntrant(s)按其運行順序顯示,未按任何順序排序。 我為冗長的帖子道歉。 應用示例

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

在您的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方法,如果這是一種可能的方法。

我猜TreeSet不是正確的數據結構。 TreeSet是一個Set - 根據比較,這些鍵被認為是唯一的。

我想你可以有相同的運行時間?

也許只需使用ArrayList並使用Collections.sort()和自定義Comparator對其進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM