【问题标题】:LinkedList can not be converted to boolean, what am i doing wronge?LinkedList 无法转换为布尔值,我做错了什么?
【发布时间】:2017-02-21 11:36:15
【问题描述】:

我目前正在学习 Java。今天我正在做一个小程序,我输入数字,程序将写入是否排序。

我认为我的逻辑是正确的,但是我遇到了一个我无法处理的小错误。

package inlamningsuppgift_arSorterad;

import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;

public class ifSorted {

    public static void main(String[] arg) {
        LinkedList a = new LinkedList();
        Scanner sc = new Scanner(System.in);
        System.out.println("Input your numbers, end with the letter \\n");

        while (sc.hasNextDouble())
            a.add(sc.nextDouble());

        if (ifSorted(a))
            System.out.println("List is sorted");
        else
            System.out.println("List is not sorted");
    }

    private static boolean ifSorted(LinkedList a) {
        Collections.sort(a);

        return a;
    }
}

【问题讨论】:

  • 您定义了返回类型为布尔值的方法,但随后尝试返回 LinkedList。
  • 您的函数aerSorterat 错误。如果我的瑞典语是正确的,这个函数应该返回一个布尔值,指示列表是否已排序。但是,您正在对实际列表进行排序并返回它。
  • @marstran 对不起瑞典语,我现在将其更正为英语。您的意思是我返回 aerSorterat 列表中的整个列表?
  • 您是否将您的类重命名为方法应具有的名称?如果我一切都正确,也许这篇文章会有所帮助:How to determine if a List is sorted in Java?
  • @KrazyKalle 是的,我做到了。感谢您的链接,我看看它:)

标签: java linked-list boolean


【解决方案1】:

做这个替换!它适用于 Java8:

1- a.stream().sorted().collect(Collectors.toList() 创建一个新的排序列表

2- .equal(a) 新列表来比较当前

private static boolean ifSorted(LinkedList a) {
      return a.stream().sorted().collect(Collectors.toList()).equals(a);        
}

【讨论】:

  • 非常感谢您的提示!它确实有效!我刚收到一个问题,为什么我必须创建一个新的 sortedList?
  • 我标记了它! :)
【解决方案2】:

让我们看看你的 aerSorterat 方法。

    private static boolean aerSorterat(LinkedList a) {
    Collections.sort(a);
    return a;
}

private static boolean 意味着您的方法将返回一个布尔值,它是 true 或 false 。您插入列表 [a] 然后返回 [a] 。没有布尔值。使用您的代码您不需要该方法。但是您必须将 if else 语句从循环中删除,以便在用户插入字符串 for ex: out 之后。它会在循环外检查您的列表。您可以根据需要使用该方法,方法是在其中插入 if else 语句并返回 true 或 false,然后使用 ifsorted.aerSorterat(a) 在主方法中调用该方法;

【讨论】:

  • 首先,感谢您的回答。其次,如果我理解正确,我应该将 if-else 语句放在公共静态布尔 ifSorted 方法中吗? :)
  • 是的,您可以这样做。或者正如我所说,您甚至不需要该方法,只需在 main 方法中将 if-else 从循环中提取出来,这样当用户插入除双精度之外的其他内容时跳出循环。然后转到您的 if-else 语句。
  • 感谢您的帮助! :)
【解决方案3】:

您实际上是在尝试使用Collections.sort(a) 对列表进行排序,但是如果您想查看您的值是否已排序,您可以这样做,例如像这样的循环:

private static boolean isSorted(List<Double> list) {
    return ascending(list) || descending(list);
}

如果您必须同时检查两种方式,您可以轻松地使用两种方法来连接||,这是一个合乎逻辑的。 单个方法只是检查列表中的所有值是否大于(升序)或小于(降序)它们的前任。

private static boolean ascending(List<Double> list) {
    for (int i = 1; i < list.size(); i++)
        if (list.get(i - 1) > list.get(i))
            return false;
    return true;
}

private static boolean descending(List<Double> list) {
    for (int i = 1; i < list.size(); i++)
        if (list.get(i - 1) < list.get(i))
            return false;
    return true;
}

如果其中一个值不符合前提,它只会返回 false。如果循环完成并正常离开,则表示所有值都已排序。

但要做到这一点,您必须将泛型参数&lt;Double&gt; 作为参数提供给您的方法,否则您无法将这些值与&lt;&gt; 进行比较。我也使用List 而不是LinkedList,因为有了这个,你可以使用任何你想要的列表。

如果你想使用数字以外的其他对象,你需要稍微改变一下。

第一个可能性是,您要使用的对象必须实现Comparable 接口,该接口提供compareTo(...) 方法。给定的,你可以是它,例如像下面这样:

public boolean ascending(List<YourObject> list) {
    for (int i = 1; i < list.size(); i++)
        if (list.get(i-1).compareTo(list.get(i)) > 0)
            return false;
    return true;
}

只需将运算符交换为降序即可。这例如可以与字符串列表一起使用。

【讨论】:

  • 非常感谢!我也工作过! :) 我也可以对对象使用这种方法吗?
  • 不客气。我将更改其他对象的答案。
  • 谢谢,我想我以后可以使用它;)
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多