2017-02-21 74 views
0

我目前正在学习Java。今天我正在制作一个输入数字的小程序,如果它们被排序,程序就会写入。LinkedList无法转换为布尔值,我在做什么?

我想我的逻辑是正确的,但我得到了一个我无法处理的错误。

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; 
    } 
} 
+2

你用一个返回类型的布尔值定义了你的方法,但是然后尝试返回一个LinkedList。 –

+1

你的功能'aerSorterat'是错误的。如果我的swedish是正确的,这个函数应该返回一个布尔值来表示列表是否被排序。但是,您正在对实际列表进行排序并将其返回。 – marstran

+0

@marstran对不起瑞典语,我现在把它改成了英文。你的意思是说我把aerSorterat名单上的整个名单归还? – TheNoob

回答

0

使此替换!它Java8工作:。

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

2- .equal(一)新的列​​表来比较当前

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

非常感谢您的提示!它实际上有效! 我刚刚有一个问题,为什么我必须做一个新的sortedList? – TheNoob

+0

@TheNome:如果你喜欢我的回答,请将其标记为已接受 – Bogojob

+0

我抨击它! :) – TheNoob

0

让我们看看你的aerSorterat方法。

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

私有静态布尔意味着你的方法将返回这是真或假。你插入列表[A],然后返回一个布尔值[A]。无布尔。随着你的代码你不需要这种方法。但是,您必须将if语句从循环中删除,以便在用户为ex:out插入一个字符串之后。它可以在循环中检查你的列表。如果你想插入你的if语句并返回true或false,然后在main方法中使用ifsorted.aerSorterat(a)调用该方法,可以使用该方法。

+0

首先,感谢您的回答。 二,如果我明白你的权利,我应该把我的if - else语句在公共静态布尔ifSorted方法? :) – TheNoob

+0

是的,你可以做到这一点。或者我说你甚至不需要该方法只是提取if-else仍然在main方法中的循环,所以当用户插入除double之外的其他东西时,它会跳出循环然后去你的if-else语句。 –

+0

感谢您的帮助! :) – TheNoob

0

你实际上是试图用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。如果循环完成并保持正常,那意味着所有的值都被排序。

但要做到这一点,您必须将通用参数<Double>作为您的方法的参数,否则您无法将这些值与<>进行比较。我也使用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; 
} 

只需交换运营商降序。例如,可以与字符串列表一起使用。

+0

非常感谢!我也工作得很好! :) 我可以用这个方法与对象吗? – TheNoob

+0

不客气。我会改变其他对象的答案。 –

+0

谢谢,我想我可以在将来使用它;) – TheNoob