如何比较输入文本中单词的长度并根据长度值对其进行排序

Posted

技术标签:

【中文标题】如何比较输入文本中单词的长度并根据长度值对其进行排序【英文标题】:How to compare the length of words in an input text and sort them according to length value 【发布时间】:2014-03-19 22:16:30 【问题描述】:

我有一串单词,我想根据它们的长度排序返回。有些单词重复了不止一次,所以我使用 HashMap 来返回单词及其计数:

Map<String, Integer> map = new HashMap<String, Integer>();

for (String s : fragments) 
    if (map.containsKey(s)) 
        map.put(s, map.get(s) + 1);
     else 
        map.put(s, 1);
    


我如何使用它来返回每个单词的长度并将它们从最长到最短排序?

编辑: 例如,如果输入是一个字符串

"From the torrent, or the fountain,From the red cliff of the mountain"

我做了一个简单的循环:

for (int i = 0; i < fragments.length; i++) 
    System.out.println(fragments[i]+" " +fragments[i].length());

输出为:(完整输出 re:@Pshemo)

from 4
the 3
or 2
the 3
the 3
red 3
cliff 5
of 2
the 3
mountain 8

等等。它是未排序的,每次看到这个词时,像“the”这样的词都会重复。我不想重复重复并将单词从最长到最短排序。

我想要的输出应该是:

mountain 8
cliff 5
from 4
the 3
red 3
of 2
or 2

【问题讨论】:

集成冒泡排序:en.wikipedia.org/wiki/Bubble_sort 你告诉我们some words are repeated more than once,但你没有告诉我们这个事实的后果。是否允许重复值? @Pshemo 我正在实施 HashMap,这样我们就不会看到多次打印出同一个单词 - 我们知道它多次出现的唯一方法是查看单词的计数。长度相同,我不想输出相同的单词两次。 据我所知,您甚至不需要这样的单词图和它们的出现次数来解决您的问题。也许发布带有输入和预期输出的示例以提供更好的帮助。 @Pshemo 我编辑了我的问题,现在它有示例。我也不确定我是否需要 HashMap。我对 Java 很陌生,所以在这里我几乎不知所措。 【参考方案1】:

使用自定义比较器:

public static void main(String[] args) 
    String phrase = "From the torrent, or the fountain, From the red cliff of the mountain";
    //or whatever method of getting the individual words you want.
    //I just chose StringTokenizer (obviously)
    StringTokenizer st = new StringTokenizer(phrase, " ,");
    TreeSet<String> ts = new TreeSet<>(new Comparator<String>() 

        @Override
        public int compare(String s1, String s2) 
            int retVal = Integer.compare(s1.length(), s2.length());
            if(retVal == 0)
                retVal = s1.compareTo(s2);
            
            return retVal;
        
    );
    while(st.hasMoreTokens())
        ts.add(st.nextToken());
    
    for(String s : ts.descendingSet())
        System.out.println(s + " " + s.length());
    

它甚至会按字母顺序排列相同长度的单词:-)

【讨论】:

谢谢!你能解释一下StringTokenizer是做什么的吗? 哎呀。我有那个最终的 for 循环迭代增加的大小。固定为按您的要求下降。 StringTokenizer - docs.oracle.com/javase/7/docs/api/java/util/… 是的,你不需要它。这只是一个完全独立的例子。如果您已经获得了数组,那么只需遍历它并将单词添加到 TreeSet。使用该自定义比较器,它会在您添加它们时为您排序(如图所示)。因此,不要使用 while 循环,只需执行一个 for(String s : yourArray)ts.add(s); 因为它是一个 Set,它会自动抛出重复项。 +1 但正如 StringTokenizer 文档中提到的那样 "StringTokenizer 是一个 legacy 类,出于兼容性原因保留,尽管在新代码中不鼓励使用它。它建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex 包代替"。您的while(st.hasMoreTokens()) ts.add(st.nextToken()); 可以简单地替换为for (String token : phrase.split("[\\s,]+")) ts.add(token);

以上是关于如何比较输入文本中单词的长度并根据长度值对其进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在替换从文本文件中读取的单词的程序中解释不同的单词长度?

单词长度

单词长度

java_单词长度

7-26 单词长度(15 分)

12/17