我正在java中执行以下编码挑战:
/**
* 4. Given a word, compute the scrabble score for that word.
*
* --Letter Values-- Letter Value A, E, I, O, U, L, N, R, S, T = 1; D, G = 2; B,
* C, M, P = 3; F, H, V, W, Y = 4; K = 5; J, X = 8; Q, Z = 10; Examples
* "cabbage" should be scored as worth 14 points:
*
* 3 points for C, 1 point for A, twice 3 points for B, twice 2 points for G, 1
* point for E And to total:
*
* 3 + 2*1 + 2*3 + 2 + 1 = 3 + 2 + 6 + 3 = 5 + 9 = 14
*
* @param string
* @return
*/
我的想法是通过执行以下操作将所有这些字母插入哈希映射中:
map.add({A,,E,I,O,U,L,N,R,S,T}, 1);
有没有办法在java中执行此操作?
答案 0 :(得分:2)
您在评论中说过,您希望能够在一个声明中添加所有这些条目。虽然Java在单个语句中不是一个很好的语言来做这样的事情,但如果你真的决定这样做,它就可以完成。例如:
Map<Character, Integer> scores =
Stream.of("AEIOULNRST=1","DG=2","BCMP=3","FHVWY=4" /* etc */ )
.flatMap(line -> line.split("=")[0].chars().mapToObj(c -> new Pair<>((char)c, Integer.parseInt(line.split("=")[1]))))
.collect(Collectors.toMap(Pair::getKey, Pair::getValue));
System.out.println("C = " + scores.get('C'));
<强>输出:强>
C = 3
在上面的代码中,我首先构建一个包含所有条目的流(如Pairs),并将它们收集到一个地图中。
注意:
我上面使用的Pair类来自javafx.util.Pair
。但是,您可以轻松地使用AbstractMap.SimpleEntry
,您自己的Pair类或任何能够容纳两个对象的集合数据类型。
更好的方法
另一个想法是编写自己的帮助方法。可以将此方法放入包含类似辅助方法的类中。这种方法更惯用,更易于阅读,因此更易于维护。
public enum MapHelper {
; // Utility class for working with maps
public static <K,V> void repeatPut(Map<? super K,? super V> map, K[] keys, V value) {
for(K key : keys) {
map.put(key, value);
}}}
然后你会像这样使用它:
Map<Character, Integer> scores = new HashMap<>();
MapHelper.repeatPut(scores, new Character[]{'A','E','I','O','U','L','N','R','S','T'}, 1);
MapHelper.repeatPut(scores, new Character[]{'D','G'}, 2);
MapHelper.repeatPut(scores, new Character[]{'B','C','M','P'}, 3);
/* etc */
答案 1 :(得分:1)
取一个长度为26的数组,每个元素代表一个字母表的分数。 所以,我们将有一个这样的数组: -
alphabetScore = [1,3,3,2,.....................];
现在,迭代单词,并继续在总分中添加当前字母的分数。
答案 2 :(得分:0)
Map
没有可以操作多个密钥的方法,但您可以流式传输这些字符的列表并调用forEach
:
Map<Character, Integer> scores = new HashMap<>();
Stream.of('A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T')
.forEach(c -> scores.put(c, 1));
Stream.of('D', 'G').forEach(c -> scores.put(c, 2));
// etc...
答案 3 :(得分:0)
一行:
Map<String, Integer> map = Stream.of( "A", "E", "I", "O", "U", "L", "N", "R", "S", "T" ).collect( Collectors.toMap( Function.identity(), o -> 1 ) );
或者如果你已经有一个字符串列表
Collection<String> chars = new ArrayList<>();
// Add to collection
Map<String, Integer> map = chars.stream().collect( Collectors.toMap( Function.identity(), o -> 1 ) );
您可以使用相同的方法添加具有相同值的其他键
map.addAll( Stream.of( "F", "H", "V", "W", "Y" ).collect( Collectors.toMap( FUnction.identity(), o -> 4 );
最终,最好使用辅助函数来提高可读性
private Map<String, Integer> mapScores( int score, String... letter ) {
return Stream.of( letter ).collect( Collectors.toMap( Function.identity(), o -> score ) );
}
Map<String, Integer> map = new ConcurrentHashMap<>();
map.putAll( mapScores( 1, "A", "E", "I", "O", "U", "L", "N", "R", "S", "T" ) );
map.putAll( mapScores( 2, "D", "G" ) );
map.putAll( mapScores( 3, "B", "C", "M", "P" ) );
map.putAll( mapScores( 4, "F", "H", "V", "W", "Y" ) );
map.put( "K", 5 );
map.putAll( mapScores( 8, "J", "X" ) );
map.putAll( mapScores( 10, "Q", "Z" ) );