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倍人