2017-02-21 12 views
0

В настоящее время я изучаю Java. Сегодня я делаю небольшую программу, где я вводим числа, и программа должна писать, если они отсортированы или нет.LinkedList не может быть преобразован в boolean, что я делаю wronge?

Я думаю, что я правильно понял логику, но у меня есть небольшая ошибка, с которой я не могу справиться.

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' неверна.Если мой шведский правильно, эта функция должна возвращать логическое значение, указывающее, отсортирован ли список или нет. Однако вы сортируете фактический список и возвращаете его. – 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; 
} 

частная статическая булевы означает, что ваш метод возвращает логическое значение, которое либо истинно, либо ложно .Вы вставленного список [а] затем вернулся [а] .No булева .СА кода Вам не нужен этот метод . Однако вы должны вырезать оператор if else из цикла, чтобы после того, как пользователь вставляет строку для ex: out. Он проверяет ваш список на стороне цикла. Вы можете использовать этот метод, если хотите, вставив в него инструкцию if else и вернув true или false, а затем вызвали этот метод в основном методе, используя ifsorted.aerSorterat (a);

+0

Во-первых, спасибо за ответ. Во-вторых, если я понимаю, что вы правы, я должен поместить мое заявление if-else в публичный статический логический метод ifSorted? :) – TheNoob

+0

Да, вы можете это сделать. Как я уже сказал, вам даже не нужен метод, просто извлеките if-else из цикла еще в основном методе, поэтому, когда пользователь вставляет что-то другое, кроме двойника, оно выходит из цикла . Затем идет к вашему утверждению 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

Смежные вопросы