【问题标题】:Using Arrays.sort, empty array returned使用 Arrays.sort,返回空数组
【发布时间】:2012-10-25 16:59:51
【问题描述】:

我正在使用Arrays.sort 方法对我自己的Comparable 对象数组进行排序。在我使用排序之前,数组已满,但在我对数组进行排序并将其打印到系统之后,没有任何东西打印出来。编辑。该数组根本不打印任何内容。不是空行,什么都没有。

这是我使用sort的方法的代码:

public LinkedQueue<Print> arraySort(LinkedQueue<Print> queue1)
{
    Print[] thing = new Print[queue1.size()];
    LinkedQueue<Print> newQueue = new LinkedQueue<Print>();

    for(int i = 0; i <queue1.size(); i++)
    {
        Print ob = queue1.dequeue();
        thing[i] = ob;
        System.out.println(thing[i]);   //printing works here
    }

    Arrays.sort(thing);

    for(int j = 0;j<thing.length-1;j++)
    {
        System.out.println(thing[j]);   //printing does not work here 
        newQueue.enqueue(thing[j]);
    }

    return newQueue;
}

这里是Comparable 对象的类Print

public class Print implements Comparable<Print>
{
    private String name;
    private int numPages,arrivalTime,startTime,endTime;

    public Print(String n, int p, int time, int sTime, int eTime)
    {
        name = n;
        numPages = p;
        arrivalTime = time;
        startTime = sTime;
        endTime = eTime;
    }

    public int getPages()
    {
        return numPages; 
    }

    public int compareTo(Print other)
    {
        if(this.getPages()<other.getPages())
            return -1;

        else if(this.getPages()>other.getPages())
            return 1;

        else
            return 0;
    }

    public String toString()
    {
        return name+"("+numPages+" pages) - printed "+startTime+"-"+endTime+" minutes";
    }
}

【问题讨论】:

  • 为什么不打印出最后一个元素? for(int j = 0;j&lt;thing.length-1;j++) 通常是 for(int j = 0;j&lt;thing.length;j++) 或只是 for (Print p : thing)
  • 另外,“此处无法打印”究竟是什么意思? anything 正在打印吗?错误的值?
  • 您可以使用Arrays.toString(thing) 打印,因为您已经在Print 类中覆盖了toString。并准确告诉我们输出是什么。
  • @JonSkeet “在我对数组进行排序并将其打印到系统后没有任何内容打印出来。”
  • 另外,您可以将 compareTo() 实现替换为 return this.numPages - other.numPages;

标签: java arrays sorting


【解决方案1】:

您的最后一个 for 循环不会打印数组中的最后一个元素。如果数组只有一个元素,它根本不会打印任何东西。改为:

for (int j = 0; j < thing.length; j++) //clean code uses spaces liberally :)
{
    System.out.println(thing[j]);
    newQueue.enqueue(thing[j]);
}

或(如果使用的 JDK/JRE 版本支持):

for (Print p : thing)
{
    System.out.println(p); 
    newQueue.enqueue(p);
}

【讨论】:

  • “干净的代码大量使用空格” 确实是个人喜好问题。我认为int j = 0 很丑。
  • 谢谢!这就是问题所在。
  • @bitva 感谢您的接受。很高兴知道我的回答有帮助。还要看看imran的答案。如果queue1 通过dequeue() 方法是可变的,则size() 返回的值可能会在循环迭代期间发生变化,从而导致不良结果(不会迭代队列中的所有对象)。您可以通过将原始大小存储在变量中并将其用于循环来解决,也可以通过在 LinkedQueue 实现中创建 isEmpty 方法来解决。
  • @bitva:那么你只使用了一个元素数组吗?如果从...开始的话真的会很有帮助
【解决方案2】:

希望问题出在这部分代码

for(int i = 0; i <queue1.size(); i++)
{
    Print ob = queue1.dequeue();
    thing[i] = ob;
    System.out.println(thing[i]);   //printing works here
}

将上面的替换为

for(int i = 0; !queue1.isEmpty() ; i++)
{
    Print ob = queue1.dequeue();
    thing[i] = ob;
    System.out.println(thing[i]);   //printing works here
}

【讨论】:

  • 谁说LinkedQueue.isEmpty() 方法?
  • LinkedQueue到底是什么?据我所知,Java 中没有标准的 LinkedQueue 实现,并且互联网中存在许多不同的自定义实现,尤其是在大学网站上。
  • @ADTC 我猜是使用 LinkedList 实现的非标准队列。
  • 如果是这样的话,当然可以扩展实现以包含一个 isEmpty 方法。
  • @NullUserException :对不起,我误解了。你能告诉我如何确保 queue1 的所有元素都插入到 thing 中吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2017-03-19
  • 2011-09-05
  • 2016-12-06
  • 2013-03-05
  • 2021-08-11
相关资源
最近更新 更多