【问题标题】:Removing duplicate linked value from ArrayList java从 ArrayList java 中删除重复的链接值
【发布时间】:2016-10-19 13:22:15
【问题描述】:

我们在使用 java 作为代码技术来实现我们的客户要求之一方面面临挑战。 我们需要对系统给出的输入进行格式化,以用户友好的格式显示数据。

下面是我们程序的输入数据。 它是一个 java 映射,键为字符串,值为字符串列表

OP1004=[],
OP1006=[OP1004]
OP1005=[OP1003]
OP1009=[OP1006, OP1044, OP1046, OP1004], 
OP1016=[OP1008, OP1009, OP1044, OP1005, OP1004], 

我们期望的输出如下。

OP1004=[],
OP1006=[OP1004]
OP1005=[OP1003]
OP1009=[OP1006, OP1044, OP1046], //here 1004 is deleted
OP1016=[OP1008, OP1009, OP1005, OP1004], //here 1044 is deleted

这里,如果我们仔细观察,我们想从列表中删除重复的值,即

如果我们通过底部,即 OP1016 包含 OP1008、OP1009 等列表。其中 OP1009 也包含 OP1006、OP1044 等列表。其中 OP1006 再次包含 OP1004 列表 所以在这里我们要从 OP1009 中删除 OP1004,因为它已经映射到其他(OP1006)OPID,它是 OP1009 的一部分。

实际上我们是在层次结构/流程图中显示它,所以我们想删除对项目的重复导航。

请帮助我们提供解决方案。提前感谢您的帮助。

谢谢

【问题讨论】:

标签: java list duplicates


【解决方案1】:

您的问题归结为检查列表的元素是否存在于其他列表中,但这些列表存在于映射中,因此您需要维护键值对。

这就是你实现这一目标的方法。

  1. 遍历map并获取key和value的list,添加条件判断list是否为空且包含1个以上的值。
  2. 再次循环相同的映射,获取键并添加条件来检查第一个循环键是否等于第二个循环键这是为了避免检查相同的列表。再添加一个条件来检查列表是否为空且包含超过 1 个值。
  3. 现在您可以使用List.removeAll() 方法从列表中删除元素,如果这些元素存在于另一个列表中。

示例代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Example {

public static void main(String[] args) {

    List<String> firstList = new ArrayList<String>();
    firstList.add("");

    List<String> secondList = new ArrayList<String>();
    secondList.add("OP1004");

    List<String> thirdList = new ArrayList<String>();
    thirdList.add("OP1003");

    List<String> fourthList = new ArrayList<String>();
    fourthList.add("OP1006");
    fourthList.add("OP1044");
    fourthList.add("OP1046");

    List<String> fifthList = new ArrayList<String>();
    fifthList.add("OP1008");
    fifthList.add("OP1009");
    fifthList.add("OP1044");
    fifthList.add("OP1005");
    fifthList.add("OP1004");

    Map<String, List<String>> map = new HashMap<String, List<String>>();
    map.put("OP1004", firstList);
    map.put("OP1006", secondList);
    map.put("OP1005", thirdList);
    map.put("OP1009", fourthList);
    map.put("OP1016", fifthList);

    for (Map.Entry<String, List<String>> keyAndValue: map.entrySet()) {
        String key = keyAndValue.getKey();
        List<String> values = keyAndValue.getValue();

        if (values.isEmpty() || (values.size() < 2)){
            continue;
        }
        for (Map.Entry<String, List<String>> mapKeyAndValue: map.entrySet()) {

            String key1 = mapKeyAndValue.getKey();
            if (key.equals(key1)){
                continue;
            }
            List<String> values2 = mapKeyAndValue.getValue();

            if (values2.isEmpty() || (values2.size() < 2)){
                continue;
            }
            values2.removeAll(values);
        }
    }

    for (Map.Entry<String, List<String>> keyAndValue: map.entrySet()) {
        System.out.println("Key is " + keyAndValue.getKey() + " Values are " + keyAndValue.getValue());
    }
}
}

检查输出Here

 Key is OP1004 Values are []
 Key is OP1006 Values are [OP1004]
 Key is OP1005 Values are [OP1003]
 Key is OP1009 Values are [OP1006, OP1044, OP1046]
 Key is OP1016 Values are [OP1008, OP1009, OP1005, OP1004]

注意 - 我假设您使用的是 HashMap,因为您没有指定您使用的是哪种地图,如果您希望订购地图,请使用 LinkedHashMap 因为HashMap 没有按顺序存储元素。

【讨论】:

    【解决方案2】:

    一个简单的解决方案是改变

    Map<String, List<String>> to Map <String<Set<String>>
    

    让我用更好的方式解释一下:

    List list = map.get(str);
    Set<String> set = new HashSet<>();
    set.addAll(list);
    list.clear();
    list.addAll(set);
    

    现在你可以按照你想要的方式使用它了..

    如果您不明白其中的任何部分,请告诉我

    【讨论】:

    • 我认为,这只会从列表中删除重复的值,但我希望它从其他列表中删除,如果这已经是其他等的键..
    • @ShivajiDole 你说的其他列表是什么意思?如果它不止一个列表.. 循环遍历它对吗?
    【解决方案3】:

    伪代码:如果键存在,则从(其他键的)任何值中删除它

    for (String key : map.keySet()){ // iterate through all keys
     for (Map.Entry<String, List> mapEntry : map.entrySet()){ // again iterate but this time get Map.Entry
      if (!mapEntry.getKey().equals(key)){ // if entry is for other key
       ((List)mapEntry.getValue()).remove(key); // then remove key from list
        // if this map cannot be modified you can keep key, mapEntry in another map here...
      }
     }
    }
    

    【讨论】:

      【解决方案4】:

      创建一个集合来保存之前显示的所有值。如果一个项目不能添加到这个集合中,那么就不要添加它。

      Map<String, String[]> original = ...
      Set<String> used = new HashSet<>();
      Map<String, String[]> reduced = original
              .entrySet().stream()
              .collect(Collectors.toMap(Map.Entry::getKey,
                      entry -> Arrays.stream(entry.getValue())
                              .filter(used::add)
                              .toArray(String[]::new)));
      

      【讨论】:

        猜你喜欢
        • 2014-03-25
        • 2015-12-24
        • 1970-01-01
        • 2018-05-29
        • 1970-01-01
        • 2011-01-26
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多