【问题标题】:Find words that are evenly short and print them all找到均匀短的单词并将它们全部打印出来
【发布时间】:2019-12-13 15:29:11
【问题描述】:

我需要编写一个程序来找出给定字符串 str 中最短的单词。我的意见是;

橄榄、鱼、追逐、警告、老、蟒、爪哇、咖啡、猫、鳐

伏特、橄榄、鱼、紧追、警告、蟒蛇、爪哇、咖啡、部分

当我输入“橄榄、鱼、追逐、警告、旧、python、java、咖啡、猫、射线”的第一次迭代时,它给了我 [cat, old, ray]

但是当我输入第二次迭代“伏特,橄榄,鱼,紧追,警告,python,java,coffee,part”时,它给了我“coffee and python”,而需要输出[fish,java,part , 伏特] ?????

你觉得跟 Arrays.sort 有关系吗???

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        String[] words = str.split(", ");
        Arrays.sort(words);
        String shortest = words[0];
        String count = "";

        for (int i = 0; i < words.length ; i++) {
            if(shortest.length() <= words[i].length() && words[i].length() == shortest.length()){
                shortest = words[i];
                count += shortest+", ";
            }
        }
        if(count.length() > 0){
            count = count.replaceAll(", $", "");
            System.out.print("["+count+"]");
        }
    }
}

【问题讨论】:

  • 嗨,欢迎来到 stackoveflow。你的问题到底是什么?
  • 您好,我需要在给定输入的数组中找到所有最短的单词。谢谢!
  • 你能解释一下你当前的代码有什么问题吗?
  • 正如 Nicolas 所说,您具体面临的问题是什么?您当前的输出是什么,预期的输出是什么?
  • 当我输入第一次迭代“橄榄,鱼,追求,警告,老,蟒蛇,java,咖啡,猫,雷”时,它给了我[猫,老,雷]但是当我输入第二次迭代是“伏特,橄榄,鱼,紧追,警告,python,java,coffee,part”它给了我咖啡和python,而需要输出[fish,java,part,volt]

标签: java arrays split


【解决方案1】:

您正在对单词进行排序,但我假设您想按长度而不是字母顺序对它们进行排序,因此words[0] 确实是shortest。为此,您必须提供特定的Comparator

Arrays.sort(words, Comparator.comparing(String::length));

如果您想按字母顺序获得最短的单词,请按长度排序first,然后按自然(字母)顺序排序then

Arrays.sort(words, Comparator.comparing(String::length)
                             .thenComparing(Comparator.naturalOrder()));

现在您的其余代码将正常工作。但是,您的主循环有点多余。不用检查长度是&lt;=====就够了,不用每次都更新shortest

for (int i = 0; i < words.length ; i++) {
    if (words[i].length() == shortest.length()){
        count += words[i] + ", ";
    }
}

或者只使用Arrays.sort(words);,你可以看两种情况:如果单词更小,记住新的smallest并重置count,如果同样小,则添加count

for (int i = 0; i < words.length ; i++) {
    if (words[i].length() < shortest.length()){
        shortest = words[i];
        count = "";
    }
    if (words[i].length() == shortest.length()){
        count += words[i] + ", ";
    }
}

或者,使用 Java 8 Stream API 首先获取最小长度,然后是具有该长度的所有单词。

int len = Stream.of(words).mapToInt(String::length).min().getAsInt();
String count = Stream.of(words).filter(w -> w.length() == len)
        .sorted().collect(Collectors.joining(", "));

【讨论】:

  • 非常感谢!!!!这一切都成功了!最后一个问题;我怎样才能按字母顺序打印它们?
  • @mistersholmes 使用stream,只需在两者之间添加sorted()。使用第一种方法,有点复杂。
  • 老兄!你是最好的!非常感谢!
【解决方案2】:

要使用您最初的想法,您需要:

String shortest = words[0];
    String count = shortest;

    for (int i = 1; i < words.length ; i++) {
        if(shortest.length() == words[i].length()){//add word to shortest list
            shortest = words[i];
            count += ", " +shortest;
        }
        else if (words[i].length() < shortest.length())//found a shorter word
        {
            shortest = words[i];
            count = shortest;

        }
        //else word is longer, do nothing
    }

如果分别处理较短和相等的情况,则更容易跟踪和追溯。另外感觉如果你已经看过第零个单词,你应该不需要再看它了。

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2015-02-24
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2020-05-05
    相关资源
    最近更新 更多