Java:查找具有最高值的字符串

时间:2017-10-02 03:05:51

标签: java string algorithm sorting

我需要接受一个字符串作为输入,将其拆分为单个单词的数组(拆分为“”)并将最高得分的单词作为字符串返回。一个单词的每个字母根据它在字母表中的位置得分:a = 1,b = 2,c = 3等。如果两个单词得分相同,我将返回原始字符串中最早出现的单词。所有字母都是小写的,所有输入都是有效的。

首先,我决定是否根据上面指定的总值对字符串进行评分,或者只是使用ascii值,结果将是相同的。所以我选择使用ascii值来简化事情。我把每个单词转换成一个字符数组,然后循环遍历总和。然后我将单词和总数放入Hashmap中。下一部分我坚持下去。如何循环遍历hashmap以找到最大值然后获取相关的单词?这是来自代码kata网站的kate。我可以自由地使用我选择解决它的任何方法。所以我没有和hashmap想法结合。

建议?

到目前为止,这是我的代码:

public static String high(String s) {
    // Your code here...


      HashMap<String, Integer> map = new HashMap<String, Integer>();
        String[] words = s.split(" ");

        // loop through all of the words, for each word get its value
        // and insert the word into map as key, value as that keys value
        for(int i = 0; i < words.length; i++) {
          char[] tempWordChars = words[i].toCharArray();
          int total = 0;
          for(int j = 0; j < tempWordChars.length; j++) {
            total = total + (int)tempWordChars[j];
          }

          map.put(tempWordChars.toString(), total);

        }

        return "";
      }

5 个答案:

答案 0 :(得分:2)

试试这个

public static String high(String s) {

        String[] words = s.split(" ");
        int max = 0;
        String sToReturn = null;
        for (String word : words) {
            char[] tempWordChars = word.toCharArray();
            int total = 0;
            for (int j = 0; j < tempWordChars.length; j++) {
                total = total + (int) tempWordChars[j];
            }
            if (total > max) {
                sToReturn = word;
                max=total;
            }

        }

        return sToReturn;
    }

答案 1 :(得分:2)

使用 java8

key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();      

System.out.println("Key : "+key+ " Maximum value : "+map.get(key));

答案 2 :(得分:2)

如果你不关心其他字符串,即如果找到一个新的高分词并且只需要最高值字符串它们就没有价值,那么hashmap就是一种矫枉过正。继续逐字遍历输入并对每个单词进行评分,如果找到分数较高的单词,请更新输出,否则一直持续到最后。

另外,如果你需要保留所有字符串的分数,那么: 为了获得最大值单词以及单词,您可以使用在单词的分数上堆积的优先级队列(即最大堆)。 创建一对单词和分数并将其插入优先级队列。

注意:您必须为队列编写比较器。

其次,使用这种方法,每次提取字符串时都会得到排序输出。

答案 3 :(得分:1)

这样的事情应该有效

Entry<String,Integer> maxTerm = null;

for(Entry<String,Integer> entry : hashMap.entrySet()) {

    if (maxTerm == null || entry.getValue() > maxTerm.getValue()) {
        maxTerm = entry;
    }
}

String wordFound = maxTerm.getKey();
int wordScore = maxTerm.getValue();

因此,您遍历hashmap,抓取每个条目,如果条目的值大于之前的值,则抓取Entry,然后从中收集值和键,并按照您的意愿使用。 / p>

答案 4 :(得分:1)

使用Java8,

import static java.util.Arrays.stream; import static java.util.Comparator.comparing; /* * Method to return highest scored word(which is defined * as sum of ASCII value of alphabets in word). * In case no word is present, Empty String is returned. */

public static String high(String s) {
    return stream(s.split("\\W+"))
            .max(comparing(str -> str.chars().sum()))
            .orElse("");
}

`