【问题标题】:Sorted Arraylist printing out in wrong order排序的 Arraylist 以错误的顺序打印出来
【发布时间】:2013-10-06 21:20:51
【问题描述】:

我有一个温度和天数的数组列表。我使用插入排序方法对数组列表进行了排序。当我将其打印出来时,它不会以排序方式打印出来,它会打印出:76、84、81、88、87。可能是因为我注释掉了 Collections.sort(dailytemps) 行吗?它出错了,所以我把它注释掉了

这是我的代码:

    import java.io.*;
import java.util.Scanner;
import java.util.Arrays;

public class DailyTemperature 
    {

    //variables
    private double temperature;
    private String day;

    //getTemp & setTemp methods
    public double getTemp()
    {
      return temperature;
    }

    public void setTemp(double newTemp)
    {
      temperature = newTemp;
    }

    //getDay & setDay methods
    public String getDay()
    {
      return day;
    }

    public void setDay(String newDay)
    {
      day = newDay;
    }

    //constructor
  public DailyTemperature(String day, double temperature)
  {
    this.day = day;
    this.temperature = temperature;
  }

  //compareTo method used for Comparable interface
  public int compareTo(DailyTemperature other)
  {
    if (temperature < other.temperature) return -1;
    if (temperature == other.temperature) return 0;
    return -1;
  }


  //toString method to print out original arraylist contents and sorted arraylist contentes
  public String toString()
  {
    return("Day of Week: " + this.getDay() +
           " - Temperature: " + this.getTemp());
  }
}



import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;

public class DailyTemperatureList
{
  public static void main (String [] args)
  {
    ArrayList<DailyTemperature> dailytemps = new ArrayList<DailyTemperature>();

    dailytemps.add(new DailyTemperature("Mon", 87.1));
    dailytemps.add(new DailyTemperature("Tue", 88.3));
    dailytemps.add(new DailyTemperature("Wed", 81.2));
    dailytemps.add(new DailyTemperature("Thu", 84.0));
    dailytemps.add(new DailyTemperature("Fri", 76.3));

    //original list printout
    System.out.println("Original List:" );
    System.out.println( dailytemps.toString() );
    System.out.println(" "); //empty line

    //method to sort array list
    insertionSort(dailytemps);
    //sorted list printout
    System.out.println("Sorted List:" );
    System.out.println( dailytemps.toString() );

    //Collections.sort(dailytemps);
  }

  static void insertionSort(ArrayList<DailyTemperature> dailytemps)
  {
    DailyTemperature temp = null;
    int position = 0;

    //loop from 2nd element on
    for (int i = 1; i < dailytemps.size(); i++)
    {
      temp = dailytemps.get(i);
      position = i;

      while ( 0 < position && temp.compareTo(dailytemps.get(position - 1)) < 0)
      {
        dailytemps.set(position, dailytemps.get(position - 1));
        position--;
      }
      dailytemps.set(position,temp);
    }
  }
}

【问题讨论】:

    标签: java sorting printing arraylist


    【解决方案1】:

    您的compareTo() 实现不正确。如果 this.temperature 大于 other.temparature,则永远不会返回 1。

      public int compareTo(DailyTemperature other)
      {
        if (temperature < other.temperature) return -1;
        if (temperature == other.temperature) return 0;
        return -1; // return 1; here
      }
    

    【讨论】:

    • 谢谢,我正在从我的计算机复制到我们的学校帐户并输入 -1 而不是 1。再问一个问题。在 DailyTemperature 类中我必须实现 Comparable 吗?因为它没有它也能工作。
    • 您最好实现Comparable&lt;DailyTemperature&gt;。如果您在没有它的情况下尝试Collections.sort(),您会得到一个例外。理想情况下,该类应该可以与Collections API 以及像TreeSet 这样的排序集合一起使用。
    • 您不需要实现Comparable,因为您正在使用自定义排序并直接访问compareTo 方法。例如,如果您想使用Collections.sort,则必须使用Comparable
    【解决方案2】:

    您评论的Collections.sort 无论如何都在打印行之后。你可以简单地做Collections.sort 然后打印而不是做一个新方法insertionSort

    【讨论】:

    • 是的。但要做到这一点,DailyTemperature 的声明需要包含implements Comparable&lt;DailyTemperature&gt;。这正是我在这个问题的早期版本中给 OP 的建议。
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多