Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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
Android 在HashMap中循环对象列表并向其中添加新对象(如果它们还没有在那里)的最佳方法是什么?_Android_Listview_Hashmap - Fatal编程技术网

Android 在HashMap中循环对象列表并向其中添加新对象(如果它们还没有在那里)的最佳方法是什么?

Android 在HashMap中循环对象列表并向其中添加新对象(如果它们还没有在那里)的最佳方法是什么?,android,listview,hashmap,Android,Listview,Hashmap,我有一个对象叫做段落 public class Paragraph { private int bookId = -1; private int chapterId = -1; private int pageNumber = -1; private int id = -1; private String text = ""; private String title = ""; } 我有一个带有标题的列表视图,为此我持有一个标题的全局列表cha

我有一个对象叫做段落

public class Paragraph {
    private int bookId = -1;
    private int chapterId = -1;
    private int pageNumber = -1;
    private int id = -1;
    private String text = "";
    private String title = "";
}
我有一个带有标题的列表视图,为此我持有一个标题的全局列表chaptersList和一个标题的HashMap以及每个标题的段落列表:

public static List<String> chaptersList;
public static HashMap<String, List<Paragraph>> paragraphsMap;
在我的适配器中,我从RestAPI数据中获取数据,这些数据被传输到适当的头列表和相同的HashMap签名中。头列表包含将位于HashMap键中的值

适配器签名:

public ChapterAdapter(Context context, List<String> listDataHeader, HashMap<String, List<Paragraph>> listChildData) {
我需要做两件事:

将新标题添加到全局标题列表中。这很容易,从收到的列表中获取标题,并在全局标题列表中搜索它,如果不存在,则添加到该标题,可能有更好的方法。如果有解决方案,我将不胜感激,但这很容易

这是一件棘手的事情。我需要浏览新的HashMap,查找每个键,以查找该键是否存在于全局HashMap段落Map中。如果该键不存在,请将其原样及其所有值列表添加到全局段落HashMap中。ELSE:如果存在,对于全局段落映射中的该键,将在构造函数参数中收到的HashMap中的所有值添加到该特定键的段落映射值列表中的同一个键

我可以开始做for循环和if以及所有那些bla-bla,但我猜Java和Java for android有更好的算法,因为这可能是一个非常常见的场景,在滚动列表视图时延迟加载更多数据,并希望从API和许多其他场景填充更多数据

P.S.P.S.如果可能的话,我宁愿在一次扫描中同时进行,以减少算法的复杂性,因为这是每次用户向下或向上多次发生的事情,因为如果他们在本章的中间开始阅读并希望获得先前的段落,例如,他们可能希望获得下一批数据或上一批数据。这里将有大量的API调用和大量的数据操作,它必须工作得非常快

我会很感激你的每一个想法


10倍

我想你不需要做循环。如果您想知道一个映射的哪些键在另一个映射中存在或不存在,您只需要计算键集,例如使用commons collections set operations作为交集。

我认为您不必遍历Hashmap,Hashmap的优点是,只要哈希值良好,它们就有快速的查找时间。相反,您可以使用ContainesKeyObject或ContainesValue对象,甚至可以使用putIfAbsent。。。函数来确定值是否在hashmap中。在任何地方都不需要循环,除非您反复检查hashmap中的值。但是,检查过程只需要上述功能之一

如果您必须检查新hashmap中的每个键,那么您不能比On做得更好,因为您必须检查每个键。在这种情况下,没有比这更好的性能了。您可以执行以下我使用的伪代码算法:

foreach(key in newHashMap){
    globalHashMap.put(key,value);
}
正如您在文档中所读到的,放置。。。方法将键值对放置在hashmap中(如果不存在),或者替换它(如果存在)


文档链接:

已完成此代码。。。感谢曾经试图帮助并试图成为更多社区的人,他们只是不想帮助

public ChapterAdapter(Context context, List<String> listDataHeader,
                             HashMap<String, List<Paragraph>> listChildData) {
    this.context = context;
    boolean isValueExists = false;

    // 1. loop over keys in the original paragraphs HashMap
    for (String key : listChildData.keySet() ) {
        List<Paragraph> localParagraphs = listChildData.get(key);
        List<Paragraph> globalParagraphs = GlobalVars.paragraphsMap.get(key);
        // 2.a. Look if this key exists in the global HashMap
        if (GlobalVars.paragraphsMap.containsKey(key)) {
            // 3. Loop over the local (new paragraphs list
            for (Paragraph localValue : localParagraphs) {
                isValueExists = false;
                // Look if the new value exists in the global paragraphs list
                for (Paragraph globalValue : globalParagraphs) {
                    // exists mark as esixt
                    if (globalValue.getId() == localValue.getId()) {
                        isValueExists = true;
                    }
                }
                // if no balue found add it to the paragraphs list
                if (isValueExists == false) {
                    GlobalVars.paragraphsMap.get(key).add(localValue);
                }
            }
        } else { // 2.b. If the key doesn't exists in the global HashMap
            GlobalVars.paragraphsMap.put(key, listChildData.get(key));
            GlobalVars.chaptersList.add(key);
        }
    }
}

算法?不,你请客。你认为它不够快是有罪的。最好让它工作,测量,看看它是否符合你的要求。我有一个for循环样式的东西。这不是懒惰,这是一个好的开发人员,可以肯定有人做得更好,并希望学习更好的方法,这有什么问题????那是一个非常糟糕的评论,对不起!算法是解决问题的一种方法。。。这是一个非常糟糕的问题,对不起。没人说你懒惰。我说你犯了早熟优化的错误,这更糟糕。没有比检查它是否存在更好的算法了,如果没有,就添加它。我想,除了正确地实现equals和hashCode,并使用一个集合而不是列表之外:那么您可以只调用add,而不必担心添加重复项。您真的不应该担心性能。首先要担心正确性。示例:当您打算在集合中使用段落类时,很可能需要equals和hashCode方法;到目前为止可能还没找到。使用平面int值作为id也可能是一种设计风格。长话短说:在讨论其他话题之前,还有很多事情你最好先研究一下,比如我的添加速度是否足够快。我不担心键,键集是我要去的地方,在我找到一个存在的键并在这两个列表中检查not enter中是否存在一个具有特定id的对象后,有关值循环的更多信息。。。如果国际扶轮不这样做,这是一个非常漫长的过程
同样,问题不在于关键,而在于价值观。。。如果我发现键存在,我需要查找listChildData HashMap列表中的每个对象,并在全局段落HashMap列表中查找相同键的对象。。。这就是我所要求的,去寻找最好的方法。10x10x,但这仍然不是答案,因为只有在地图中没有键的情况下才将所有值放入。我想问的是在地图上的值列表上循环,并在其他地图的其他列表中查找它们的棘手部分。。。但这里的10%的人有时是典型的工程师或cs人员,不幸的是,他们希望一切都按照规则进行。如果能有更多的人性,那就太好了,但它被设计成严格的问答式。没有对你的问题发表任何评论,只是对你更多的社区评论发表评论。10x,正如你所看到的,我有几点看法,我已经帮助了很多人在这里消磨时间。。。以前从没见过这样的事。。。第一次用Java标签问Java问题时,会三思而后行再问那些家伙。。。这真的很糟糕。。。但没关系。。。我的问题在这里的所有规则下都是合法的。。。我就不说了。。。使用我的解决方案进入我的应用程序的下一部分。10倍人