请考虑Java
中的以下代码:
final LinkedHashSet<String> alldata = new LinkedHashSet<String>();
for (final String folder: folders) {
for (final String d: data.get(folder)) {
allData.add(d);
}
}
当folders
为List<String>
而data
为Map<String, List<String>>
时。
data
的示例:
{data1=[prepare, echo2, echo1], data2=[prepare, sleep2, check]}
直到现在,我并不关心allData
的顺序,它看起来像:
[prepare, echo1, echo2, sleep2, check]
我有一个列表dataList
,其中包含正确的数据顺序(当然还有所有数据):
[prepare, sleep1, echo1, sleep2, echo2, check]
我想遍历data
,并以正确的顺序将allData
中定义的内容添加到data
中。
上一个示例的输出应为:
[prepare, echo1, sleep2, echo2, check]
另一个例子:
data = {data1=[prepare], data2=[prepare, sleep2,sleep1,echo2]}
dataList = [prepare, sleep1, echo1, sleep2, echo2, check]
预期输出:
allData = [prepare,sleep1,sleep2,echo2]
当然,可能有两个以上的内部数据(data1,data2,...,dataN
)。
我不确定将代码添加到内部for
循环中是否正确,因为这样做我将不得不添加另一个循环来遍历dataList
,并且效率不高(3个循环)。
我应该使用哪种良好,清洁和高效的方式?
编辑:我不会尝试对集合进行排序。但是我想到了以下算法:
创建所有数据的Set
,然后遍历dataList
并插入LinkedHashSet
。
效率高吗?
EDIT2 :我尝试做的事情:
final Set<String> activeData = new HashSet<String>();
for (final String folder: folders) {
for (final String d: fubsAndSteps.get(folder)) {
activeData.add(d);
}
}
final LinkedHashSet<String> allData = new LinkedHashSet<String>();
for (final String main_data : dataList) {
for (final String active_data: activeData) {
if (main_data.equals(active_data)) {
allData.add(active_data);
}
}
}
这对我有用,但看起来并不好,我的意思是4个for
循环。它不干净高效。有更好的算法吗?
答案 0 :(得分:2)
解决方案之一是
遍历datalist
并检查元素data
中是否存在,然后将其添加到allData
中以保持顺序
Set<String> tempSet = new HashSet<>();
folders.forEach(folder -> tempSet.addAll(data.get(folder))); // flattening all the data elements into single set
//Iterate over dataList where you are already maintaining order. If element exists, add it to allData
dataList.forEach(item -> {
if(tempSet.contains(item)){
allData.add(item);
}
});
如果您使用的是Java 7或更低版本
Set<String> tempSet = new HashSet<>();
// flattening all the data elements into single set
for(String folder:folders) {
tempSet.addAll(data.get(folder));
}
//Iterate over dataList where you are already maintaining order. If element exists, add it to allData
for(String item:dataList){
if(tempSet.contains(item)){
allData.add(item);
}
}