Java 按长度降序排列单词

Java 按长度降序排列单词,java,Java,要求: 编写一个程序来接受一个字符串,并在不使用数组的情况下按长度降序打印单词 例如: 输入=我爱我的国家印度 输出=国家印度爱我的我 我曾尝试使用嵌套循环来解决这个问题,但对于较大的输入来说,这需要时间。建议一个更好的替代算法 //Input=I love my country India //Output=country India love my I public static void main(String[] JVJplus) { String s,temp="&q

要求:

编写一个程序来接受一个字符串,并在不使用数组的情况下按长度降序打印单词

例如:

输入=我爱我的国家印度

输出=国家印度爱我的我

我曾尝试使用嵌套循环来解决这个问题,但对于较大的输入来说,这需要时间。建议一个更好的替代算法

//Input=I love my country India
//Output=country India love my I
public static void main(String[] JVJplus)
{
    String s,temp="",newS="";
    int i,j;
    System.out.print("Entet s=");
    s=in.nextLine()+" ";
    for(i=s.length();i>0;i--)
    {
        for(j=0;j<s.length();j++)
        {
            char c=s.charAt(j);
            if(c!=' ')
                temp+=c;
            else
            {
                if(temp.length()==i)
                    newS+=temp+" ";
                temp="";
            }
        }
    }
    System.out.println("Output="+newS);
}
//Input=我爱我的祖国印度
//输出=国家印度爱我的我
公共静态void main(字符串[]JVJplus)
{
字符串s,temp=“”,newS=“”;
int i,j;
系统输出打印(“Entet s=”);
s=in.nextLine()+“”;
对于(i=s.length();i>0;i--)
{

对于(j=0;j如果不允许使用数组,那么regex呢

因此,我们的想法是使用一个带有临时int变量
i
的for循环,该变量用
输入字符串的长度初始化,每次迭代减少1

在循环中,我们使用正则表达式检查
输入
字符串是否包含长度为i的任何单词,这是正则表达式
\\b\\w{“+i+”}\\b
匹配的:精确的
i
连续单词字符(=长度为i的任何单词)

最后,如果有匹配项,我们将它们打印到sysout

我们从
i=input.length()
开始,因为我们首先需要最长的单词,而且可能整个输入字符串都是一个单词

    String input = "I love my country India";
    for (int i = input.length(); i > 0 ; i--) {
        Matcher m = Pattern.compile("\\b\\w{"+i+"}\\b").matcher(input);
        while(m.find()){
            System.out.print(m.group(0) +" ");
        }
    }

打印
country India love my I

您可以使用LinkedHashMap(如果单词长度相同,您希望根据插入顺序对其排序),否则您也可以使用HashMap

我已经使用LinkedHashMap作为解决方案

Input: "I love my country India"
解决方案:

String sentence = "I love my country India";

StringBuilder sb = new StringBuilder(); 

LinkedHashMap<String, Integer> hm = new LinkedHashMap<String, Integer>();

    for(String word : sentence.split(" ")){

        hm.put(word, word.length()); 

    }

    hm.entrySet().stream()
    .sorted(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder()))
    .forEach(e->{
    sb.append(e.getKey() + " ");  
    });


String result = sb.substring(0).trim();

System.out.print(result);

在这种情况下,使用HashMap将给出相同的输出,因为字符串中没有相同长度的字。

不使用数组
意味着没有数组、数组列表、比较器可以作为解决方案的一部分?如果所有这些都被禁止,那么您的解决方案可能就足够了。我同意elefasGR。请记住:yo您正在询问如何改进工作代码。此类请求可以/应该访问codereview.stackexchange.com…并记住:这一“难题”的全部要点就是不要使用数组。从这个意义上说:无论如何,你不会解决那么多的问题;所以你真的不需要太担心你的解决方案的性能。换句话说:你必须以某种方式“补偿”不能使用数组。毫不奇怪,一个节省内存的解决方案需要“更多”cpu周期!扮演恶魔的倡导者,字符串在技术上不是字符的“数组”吗?您使用这个“数组”时使用:char c=s.charAt(j);问题肯定有点模糊?elefasGR假设比较器被排除在外…为什么?使用SortedSet的解决方案如何?集合是集合,而不是数组、列表等。。。
Output: "country India love my I"