【问题标题】: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 很陌生,所以在这里我几乎不知所措。

标签: java sorting hashmap


【解决方案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 循环迭代增加的大小。固定为按您的要求下降。
  • 是的,你不需要它。这只是一个完全独立的例子。如果您已经获得了数组,那么只需遍历它并将单词添加到 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);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多