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

时间:2019-01-03 18:28:19

标签: java

请考虑Java中的以下代码:

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的示例:

{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循环。它不干净高效。有更好的算法吗?

1 个答案:

答案 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);
        }
    }