Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将列表转换为hashmap_Java_Spring_Mongodb_Spring Boot_Collections - Fatal编程技术网

Java 将列表转换为hashmap

Java 将列表转换为hashmap,java,spring,mongodb,spring-boot,collections,Java,Spring,Mongodb,Spring Boot,Collections,这个问题的标题可能会给你一个重复问题的印象,但据我所知,它不是 我在Java只有几个月大,在MongoDB、SpringBoot和REST只有一个月大 我有一个Mongo集合,文档中有3个字段,\u id default field、appName和appKey。我使用list遍历所有文档,并找到一个appName和appKey与传递的文档匹配的文档。该集合目前只有4个条目,因此运行平稳。但我读了一些关于集合的内容,发现如果集合中的文档数量更多,那么使用list的结果将比hashMap慢得多 但

这个问题的标题可能会给你一个重复问题的印象,但据我所知,它不是

我在Java只有几个月大,在MongoDB、SpringBoot和REST只有一个月大

我有一个Mongo集合,文档中有3个字段,\u id default field、appName和appKey。我使用list遍历所有文档,并找到一个appName和appKey与传递的文档匹配的文档。该集合目前只有4个条目,因此运行平稳。但我读了一些关于集合的内容,发现如果集合中的文档数量更多,那么使用list的结果将比hashMap慢得多

但是,正如我已经说过的,我对Java非常陌生,我在将代码转换为hashMap时遇到了一些困难,所以我希望有人能指导我完成这项工作

我也附上我的代码作为参考

public List<Document> fetchData() {
    // Collection that stores appName and appKey
    MongoCollection<Document> collection = db.getCollection("info");
    List<Document> nameAndKeyList = new ArrayList<Document>();

    // Getting the list of appName and appKey from info DB
    AggregateIterable<Document> output = collection
            .aggregate(Arrays.asList(new BasicDBObject("$group", new BasicDBObject("_id",
                    new BasicDBObject("_id", "$id").append("appName", "$appName").append("appKey", "$appKey"))

    )));
    for (Document doc : output) {

        nameAndKeyList.add((Document) doc.get("_id"));

    }
    return nameAndKeyList;

}// End of Method
然后我在同一类的另一个方法中调用它:

List<Document> nameAndKeyList = new ArrayList<>();

        //InfoController is the name of the class
        InfoController obj1 = new InfoController();
        nameAndKeyList = obj1.fetchData();

        // Fetching and checking if the appName & appKey pair
        // is present in the DB one by one.
        // If appName & appKey mismatches, it increments the value
        // of 'i' and check them with the other values in DB
        for (int i = 0; i < nameAndKeyList.size(); i++) {

           "followed by my code"
如果我没有错的话,那么也就不需要上面的循环了


提前感谢。

首先,列表并不比HashMap慢或快多少。Hasmap通常用于保存密钥对值,如ID、Name或类似的内容。在您的例子中,我看到您使用的ArrayList没有指定列表大小。当您不知道数组的大小时,最好使用链表,因为arraylist后面有一个数组,并通过复制来扩展它。如果要从列表中生成Hasmap或使用Hasmap,则需要将ID和值映射到记录

HashMap<String /*type of the identifier*/, String /*type of value*/> map = new HashMap<String,String>();
for (Document doc : output) {
        map.put(doc.get("_id"), doc.get("_value"));
}

首先,如果不知道表达式是什么,请避免过早优化。在列表中放入数千个包含近似真实数据的项目。尝试检索不存在的项目。这将迫使for循环遍历整个列表。看看需要多长时间。尝试几次,以获得你是否变得不耐烦的印象。如果你不这样做,你就完了

如果您发现需要加速,我同意HashMap是一个显而易见的解决方案。首先要考虑的一个问题是HashMap的关键类型。据我所知,您需要搜索的是appName和appKey都正确的项目。好的解决方案是用这两个字段和equals以及hashCode方法编写一个简单的类,我现在称它为DocumentHashMapKey,想一个更好的名称。对于hashCode,请尝试Objects.hashappName和appKey。如果它不能给你的数据带来满意的性能,请考虑其他选择。现在,您已经准备好构建HashMap

如果你是懒惰的,或者只是想要一个哈希地图如何执行的第一印象,你也可以通过连接AppNord+$@ @ AppKkey来构建你的密钥,其中中间的字符串是不太可能是名称或密钥的一部分,并使用HasMetrase.


我说的每句话都可以根据你的需要加以改进。这只是为了让您开始。

您只需要一个简单的查找查询,就可以直接从Mongo DB获取所需的记录

Document document = collection
            .find(new Document("appName", someappname).append("appKey", someappkey)).first();

谢谢大家的帮助,没有你们的帮助,我将无法找到解决办法

public HashMap<String, String> fetchData() {

    // Collection that stores appName and apiKey
    MongoCollection<Document> collection = db.getCollection("info");

    HashMap<String, String> appKeys = new HashMap<String, String>();

    // Getting the list of appName and appKey from info DB
    AggregateIterable<Document> output = collection
            .aggregate(Arrays.asList(new BasicDBObject("$group", new BasicDBObject("_id",
                    new BasicDBObject("_id", "$id").append("appName", "$appName").append("appKey", "$appKey"))

    )));

    String appName = null;
    String appKey = null;

    for (Document doc : output) {

        Document temp = (Document) doc.get("_id");

        appName = (String) temp.get("appName");
        appKey = (String) temp.get("appKey");
        appKeys.put(appName, appKey);

    }
    return appKeys;
将上述方法调用到同一类的另一个方法中

InfoController obj = new InfoController();

            //Fetching the values of 'appName' & 'appKey' sent from 'info' DB
            HashMap<String, String> appKeys = obj.fetchData();

            storedAppkey = appKeys.get(appName);

            //Handling the case of mismatch
            if (storedAppkey == null || storedApikey.compareTo(appKey)!=0)
            {//Then the response and further processing that I need to do.
现在HashMap所做的是,它使我的代码更具可读性,并且我用于迭代的“for”循环也消失了,尽管到目前为止,它在性能上可能没有太大的差异


再次感谢大家的帮助和支持。

我在那里看不到任何map实施?你想添加到哪里?嗨,@FlyingZombie。我想用hashMap代替list。有什么我遗漏的或者我需要知道的吗?你预计清单中会有多少元素?因为你到目前为止所说的话而发问,并不能说服我你会有一个问题,那就是它太慢了。成千上万的元素。这是我想切换的唯一原因。List是一个接口,它的一个实现是ArrayList,而HashMap是Map接口的一个实现,不一定是所有情况下性能最好的,因此,如果您关心的是性能,那么您还应该查看Map的其他实现,以确定适合您的情况的最佳实现。然而,在实施该计划并衡量绩效收益后,你很可能会失望;数千个元素根本不算多,速度差异很可能是不明显的。除非测量结果显示速度更快,否则不要切换到LinkedList。我怀疑它会慢一点。它肯定会占用更多的空间。@Code.It,在搜索文档的字段时,如果有一百万个字段,那么与hashMap的O1相比,当ArrayList性能处于启用状态时,hashMap是否会更快?如果您不知道列表的大小,并且它可以扩展多达10条记录,则首选LinkedList。因为你没有
我不明白我说的:当你不知道内容的大小时,不应该使用ArrayList!你好,@Code.IT。谢谢,但我的主要问题是如何处理AggregateIterable输出,因为我尝试使用map而不是Array.asList,但不知何故未能正确处理。一方面,如果足够快,这是一个简单的解决方案。另一方面,如果不是这样,我希望您可以在Java中更快地完成它。您完全正确,没有理由将自己局限于Java解决方案。