【问题标题】:Java HashMap custom ObjectJava HashMap 自定义对象
【发布时间】:2016-05-12 20:18:33
【问题描述】:

例子:

d1 = "天空是蓝色的"

d2 = "这辆车是蓝色的"

Key          Value
the          [<d1,1>,<d2,1>]
sky          [<d1,1>]
is           [<d1,1>,<d2,1>]
blue         [<d1,1>,<d2,1>]
car          [<d2,1>]

在哪里: 键=字符串

例如:

<d1,1>

d1 = 文档 ID

1 = 单词在文件中出现的次数

我用 docid 变量和频率创建了一个文档类型对象。

public class Documento {

    private final int docid;
    private final int frequencia;

    public Documento(int docid, int frequencia) {
        this.docid = docid;
        this.frequencia = frequencia;
    }

    public int getDocid() {
        return docid;
    }

    public int getFrequencia() {
        return frequencia;
    }

    @Override
    public boolean equals(Object o) {
        if ((o instanceof Documento) && docid == ((Documento) o).docid && frequencia == ((Documento) o).frequencia) {
            return true;
        }
        return false;
    }

而字典类是一个带有

的哈希图
public class Dicionario {

    public Map<String, Documento> indice = new HashMap<>();

    public void InsereDicionario(String palavra, int docid) {
        int cont = indice.containsKey(palavra) ? indice.get(palavra).getFrequencia() : 0;
        indice.put(palavra, new Documento(docid, cont + 1));
    }

    public int frequencia(String palavra) {
        return indice.get(palavra).getFrequencia();
    }

    public void criaDicionario(String entrada) {
        String[] palavras = entrada.split("\\s+");
        for (int i = 0; i < palavras.length; i++) {
            InsereDicionario(palavras[i], 1);
        }

    }
    public void ListaPalavras(){
        for(String key:indice.keySet()){
            System.out.println("");
        }

}

但是我真正需要的字典是一个文档列表,我不知道该怎么做,有人可以帮助我吗?

或者有更简单的方法吗?

【问题讨论】:

    标签: java object arraylist hashmap


    【解决方案1】:

    如果您需要一份文档列表,为什么不创建一个?使用 Java8,这变得更加方便:

    例如:

    public Map<String, List<Documento>> indice = new HashMap<>();
    
    //register new word
    indice.putIfAbsent(palavra, new ArrayList<>());
    //add additional occurence
    indice.get(palavra).add(documento);
    //get frequency
    int frequencia = indice.get(palavra)
                           .stream()
                           .map(d -> d.getFrequencia())
                           .reduce(0, (s, i) -> s + i);
    

    另一种方法是使用 Guava 的 Multimap,请参阅 here

    【讨论】:

    • .map(d -> d.getFrequencia()) 返回:method map in interface Stream&lt;T&gt; cannot be applied to given types; required: Function&lt;? super Documento,? extends R&gt; found: &lt;none&gt; reason: cannot infer type-variable(s) R (argument mismatch; &lt;none&gt; cannot be converted to Function&lt;? super Documento,? extends R&gt;) where R,T are type-variables: R extends Object declared in method &lt;R&gt;map(Function&lt;? super T,? extends R&gt;) T extends Object declared in interface Stream
    【解决方案2】:
    Map<String, List<Documento>>
    

    显然您需要调整其余代码。

    例如,当您需要向字典中添加内容时,如果这是您第一次需要使用该单个文档创建List,那么下次您需要获取已经创建的列表并在那里添加文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2011-11-08
      • 2020-08-14
      • 1970-01-01
      相关资源
      最近更新 更多