Как я могу напечатать самое длинное слово из определенного пользователем списка? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть этот код, чтобы напечатать самое длинное слово в определенном пользователем списке, но в результате я получаю нулевое значение. Я преобразовал список в строку, но он все еще не работает.

public class no7 {

  public static String getLongestString(String[] array) {
      int maxLength = 0;
      String longestString =null;
      for (String s : array) {
          if (s.length() > maxLength) {
              maxLength = s.length();
              longestString = s;
          }
      }
      return longestString;
  }

  public static void main(String[] str) {


      Scanner in = new Scanner(System.in);
    System.out.println("Enter a list:");
    ArrayList<String> list = new ArrayList<String>();
     str = list.toArray(new String[0]);


     while (!in.hasNext("done") && !in.hasNext("Done") )
        {
        list.add(in.next());
        }

     String longestString = getLongestString(str);
      System.out.format("longest string: '%s'\n", longestString);



        }
  }

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Прежде всего, public static void main(String[] str) {, а затем str = list.toArray(new String[0]); - это не то, для чего нужен параметр main, FYI.

Кроме того, str не будет содержать то, что пользователь вводит, если вы назначите str содержимое списка до заполнения самого списка.

Наконец, почему getLongestString не может просто принимать и работать с List вместо массива? Вы все равно получаете к нему доступ последовательно.

Все это приводит к

public class no7 {

    public static String getLongestString(List<String> array) {
        int maxLength = 0;
        String longestString =null;
        for (String s : array) {
            if (s.length() > maxLength) {
                maxLength = s.length();
                longestString = s;
            }
        }
        return longestString;
    }

    public static void main(String[] str) {


        Scanner in = new Scanner(System.in);
        System.out.println("Enter a list:");
        ArrayList<String> list = new ArrayList<String>();    

        while (!in.hasNext("done") && !in.hasNext("Done") )
        {
            list.add(in.next());
        }

        String longestString = getLongestString(list);
        System.out.format("longest string: '%s'\n", longestString);



    }
}

В качестве примечания, no7 для имени класса не соответствует соглашению об именовании java. Это должно быть No7 (не забудьте переименовать файл соответственно).

2 голосов
/ 27 февраля 2020

Ответы, предоставленные Федерико Клезом Culloca и sleepToken, действительны, я просто хочу еще немного очистить ваш код, обращая внимание на следующее:

  • Использовать попробовать с ресурсы для открытия и автоматического закрытия сканера.

  • Предпочитают ссылаться на объекты по их интерфейсам . Даже если вы создаете экземпляр ArrayList<String>, предпочтительнее присвоить результат List<String>.

  • Ваш код не может определить конец входного потока. Вы проверяете наличие слова «выполнено» или «выполнено», но не проверяете, доступно ли какое-либо слово вообще. Если поток закрывается без отправки «Done» или «Done», то ваша программа останавливается с исключением.

  • Вы можете получить строку с максимальной длиной, используя одну строку с Java API потоков.

  public static String getLongestString(List<String> strings) {
    return strings.stream().max(Comparator.comparingInt(String::length)).orElse(null);
  }

  public static void main(String[] str) {
    System.out.println("Enter a list:");
    try (Scanner in = new Scanner(System.in)) {
      List<String> list = new ArrayList<>();
      while (in.hasNext()) {
        String next = in.next();
        if ("done".equalsIgnoreCase(next)) {
          break;
        }
        list.add(next);
      }
      String longestString = getLongestString(list);
      System.out.format("longest string: '%s'%n", longestString);
    }
  }

1 голос
/ 27 февраля 2020

Забудьте возиться с main аргументами - и нет необходимости отслеживать maxLength. String.length () уже делает это за вас.

Не забудьте закрыть сканер. : ~ p

Редактировать: Если вы хотите распечатать связи, вы можете сохранить каждое слово в HashMap длинах сопоставления -> слова.

Например:

3 -> "cat", "dog"
4 -> "door", "tree", "frog"

Теперь мы можем найти самый большой ключ (4) и вернуть список этих слов.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.println("Enter a list:");

        ArrayList<String> list = new ArrayList<String>();

        while(!in.hasNext("done") && !in.hasNext("Done")) {
            list.add(in.next());
        }

        String longestString = getLongestString(list);
        System.out.format("longest string: '%s'\n", longestString);

        in.close();
    }

     public static String getLongestString(ArrayList<String> array) {
         Map<Integer, List<String>> lengths = new HashMap<Integer, List<String>>();

          // Put each word in the HashMap, mapped by its length
          for (String s : array) {
              if (lengths.get(s.length()) == null) {
                  lengths.put(s.length(), new ArrayList<String>());
                  lengths.get(s.length()).add(s);
              } else {
                  lengths.get(s.length()).add(s);
              }
          }

          // Store the entry with the longest length
          Map.Entry<Integer, List<String>> maxEntry = null;

          for (Map.Entry<Integer, List<String>> entry : lengths.entrySet()) {
              if (maxEntry == null || entry.getKey() > maxEntry.getKey()) {
                  maxEntry = entry;
              }
          }

          return maxEntry.getValue().toString().replace("[","").replace("]", "");
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...