如何将具有相同值的多个键插入Java中的哈希映射?

问题描述 投票:1回答:4

我正在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中有没有办法做到这一点?

java
4个回答
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
投票

取一个长度为26的数组,每个元素代表一个字母表的分数。所以,我们将有一个这样的数组: -

alphabetScore = [1,3,3,2,.....................];

现在,迭代单词,并继续在总分中添加当前字母的分数。


1
投票

我认为将更多字符列表存储为键(查看this question)和与此键对应的单个值并不是一个好主意,但如果您确实需要,可能需要尝试这样做:

Map<ArrayList<Character>, Integer> map = new HashMap<>();
map.put(new ArrayList<Character>(Arrays.asList('A', 'E',...)), 1);
map.put(new ArrayList<Character>(Arrays.asList('D', 'G',...)), 2);

就个人而言,我建议使用HashMap<Integer, ArrayList<Character>> - 键是一组字母的“值”(例如,对于包含字母的Qazxswpoi,键将为1:A,E等),因为对应于该Integer键的值可能是存储字符的ArrayList (A,E,......)。您可以通过以下方式实现该结果

ArrayList

0
投票

Map<Integer, ArrayList<Character>> map = new HashMap<>(); map.put(1, new ArrayList<Character>(Arrays.asList('A', 'E',...))); map.put(2, new ArrayList<Character>(Arrays.asList('D', 'G',...))); 没有可以操作多个键的方法,但你可以流式传输这些字符的列表并调用Map

forEach
© www.soinside.com 2019 - 2024. All rights reserved.