首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据添加到列表中并保持正确的顺序

将数据添加到列表中并保持正确的顺序
EN

Stack Overflow用户
提问于 2019-01-03 18:28:18
回答 1查看 72关注 0票数 2

考虑一下Java中的以下代码

代码语言:javascript
复制
final LinkedHashSet<String> alldata = new LinkedHashSet<String>();
for (final String folder: folders) {
    for (final String d: data.get(folder)) {
        allData.add(d);
    }
}

foldersList<String>dataMap<String, List<String>>时。

data实例

代码语言:javascript
复制
{data1=[prepare, echo2, echo1], data2=[prepare, sleep2, check]}

直到现在,我并不关心allData的顺序,它看起来是:

代码语言:javascript
复制
[prepare, echo1, echo2, sleep2, check]

我有一个列表dataList,它包含数据的正确顺序(当然还有所有数据):

代码语言:javascript
复制
[prepare, sleep1, echo1, sleep2, echo2, check]

我想遍历data,并按正确的顺序将在data中定义的内容添加到allData中。

上一个示例的输出应该是:

代码语言:javascript
复制
[prepare, echo1, sleep2, echo2, check]

另一个例子是:

代码语言:javascript
复制
data = {data1=[prepare], data2=[prepare, sleep2,sleep1,echo2]}
dataList = [prepare, sleep1, echo1, sleep2, echo2, check]

预期产出:

代码语言:javascript
复制
allData = [prepare,sleep1,sleep2,echo2]

当然,可能有两个以上的内部数据(data1,data2,...,dataN)。我不确定将代码添加到内部for循环中是否正确,因为通过这样做,我将不得不添加另一个循环来遍历dataList,而且它感觉并不有效(3个循环)。

我应该用什么好的、干净的、高效的方式呢?

编辑:我不尝试对集合进行排序。但我想做以下算法:

创建所有数据的Set,然后遍历dataList并插入到LinkedHashSet中。

有效率吗?

EDIT2:我想做的是:

代码语言:javascript
复制
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循环。它感觉不干净和有效率。有更好的算法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-03 18:51:55

其中一个解决方案是在datalist上迭代并检查data中的元素是否存在,然后将其添加到allData中,以保持顺序。

代码语言:javascript
复制
    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或更低版本

代码语言:javascript
复制
    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);
        }
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54027854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档