2016-10-19 4 views
0

Перед нами стоит задача выполнить одно из наших требований клиента, используя java в качестве технологии кода. , нам нужно отформатировать входной сигнал, заданный системой, для отображения данных в удобном для пользователя формате.Удаление дублированного связанного значения из ArrayList 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 , поэтому здесь мы хотим удалить OP1004 из OP1009, потому что он уже сопоставлен с другим OPPO6 OPID, который является частью OP1009.

Фактически мы показываем это в диаграмме hierachy/блок-схемы, поэтому мы хотим удалить дублируемую навигацию по элементам.

Пожалуйста, помогите нам в предоставлении решения. оцените вашу помощь заранее.

Благодаря

+0

Пожалуйста, разместите код, который вы пробовали до сих пор. – Reinard

+3

вы считали использование набора вместо списка? – Ash

+0

Возможный дубликат [Удаление объекта только из дубликата ArrayList] (http://stackoverflow.com/questions/7543131/removing-an-object-from-the-duplicate-arraylist-only) – akshay

ответ

0

Ваша задача сводится к проверке того, присутствуют ли в других списках элементов списка, но их список присутствуют в карте, так что вам нужно, чтобы сохранить пару ключ-значение.

Вот как вы можете это достичь.

  1. Завершить карту и получить ключ и список значений, добавить условие, чтобы проверить, пуст ли пуст и содержит более 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 не хранит элементы на заказ.

0

простое решение было бы изменить

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); 

теперь вы можете использовать его так, как вы хотите ..

Сообщите мне, если вы не понимаете какую-либо его часть

+0

Я думаю, что это просто удалит повторяющиеся значения из списка, но я хочу, чтобы он был удален из другого списка, если это уже ключ для других и т. Д. –

+0

@ShivajiDole Что вы подразумеваете под другим списком? если это больше, чем один список ... проведите через него правильно? –

0

Псевдо-код: если ключ существует, то удалить его из любых значений (от других ключей)

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... 
    } 
} 
} 
0

Создать набор для хранения всех значений ранее отображенных. Если элемент нельзя добавить в этот набор, не добавляйте его вообще.

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))); 
Смежные вопросы