考虑一下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,并按正确的顺序将在data中定义的内容添加到allData中。
上一个示例的输出应该是:
[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循环。它感觉不干净和有效率。有更好的算法吗?
发布于 2019-01-03 18:51:55
其中一个解决方案是在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);
}
}https://stackoverflow.com/questions/54027854
复制相似问题