Java: Finding the shortest word in a string and pr

2020-02-15 02:53发布

I'm a novice with Java. I took a class in C, so I'm trying to get myself out of that mode of thinking. The program I'm writing has a section in which the user enters an integer, n, and then n number of words afterwards. This section then searches through those words and finds the shortest one, then returns it to the user. For instance, an input might be:

INPUT: 4 JAVA PROGRAMMING IS FUN

OUTPUT: IS

The code I have currently seems to return the wrong word. In this instance, it returns "PROGRAMMING", when it should return "IS". I thought maybe you all could point me in the right direction.

int numwords = scan.nextInt();
    String sentence = scan.nextLine();
    String shortestword = new String();
    String[] words = sentence.split(" ");
    for (int i = 0; i < numwords; i++){
        if (shortestword.length() < words[i].length()){
            shortestword = words[i];

        }
    }
    System.out.printf(shortestword);

To give you an idea of what I was trying to do, I was attempting to enter the words into a string, "sentence," then break that string up into individual words in an array, "words[]," then run a for loop to compare the strings to each other by comparing the lengths to the entries in the array. Thank you for your assistance!

4条回答
SAY GOODBYE
2楼-- · 2020-02-15 03:37

Here's a version that makes use of Java 8's Stream API:

String sentence = "PROGRAMMING IS FUN";
List<String> words = Arrays.asList(sentence.split(" "));

String shortestWord = words.stream().min(
                                     Comparator.comparing(
                                     word -> word.length()))
                                    .get();

System.out.println(shortestWord);

You can also sort more complex objects by any of their attribute: If you have a couple of Persons and you wanted to sort them by their lastName, shortest first, the code becomes:

Person personWithShortestName = persons.stream().min(
                                                 Comparator.comparing(
                                                 person -> person.lastName.length()))
                                                .get();
查看更多
爷、活的狠高调
3楼-- · 2020-02-15 03:39

You're almost there, but your comparison to detect the shortest word is reversed. It should be:

if (words[i].length() < shortestword.length()) {

That is, if your current word's length is less than the length of your previous shortest word, overwrite it.

Also, instead of starting with an empty String, start with the first word, i.e., words[0]. Otherwise, the empty string will always be shorter than any string in your array:

String[] words = sentence.split(" ");
String shortestword = words[0];
for (int i = 1; i < numwords; i++) { // start with 1, because you already have words[0]
查看更多
手持菜刀,她持情操
4楼-- · 2020-02-15 03:42

Your if statement is wrong. This should work.

int numwords = scan.nextInt();
    String sentence = scan.nextLine();
    String shortestword = new String();
    String[] words = sentence.split(" ");
    for (int i = 0; i < numwords; i++){
        if (shortestword.length() > words[i].length()){
            shortestword = words[i];

        }
    }
    System.out.printf(shortestword);
查看更多
你好瞎i
5楼-- · 2020-02-15 03:42

Java 8 has made it simpler. Convert your String array to a list and use sorted() to compare and sort your list in ascending order. Finally, use findFirst() to get the first value of your list (which is shortest after sorting).

have a look,

String[] words = new String[]{"Hello", "name", "is", "Bob"};
String shortest = Arrays.asList(words).stream()
      .sorted((e2, e1) -> e1.length() > e2.length() ? -1 : 1)
      .findFirst().get();

System.out.println(shortest);
查看更多
登录 后发表回答