Сравнение списка> в список> Java - PullRequest
1 голос
/ 26 сентября 2019

У меня есть метод, который принимает List<String> и List<Map<String, Object>>:

public List<Map<String, Object>> filterMethod() {

    List<String> listId = this.getUserIds(); //includes only the user id's
    List<Map<String, Object>> listUser = this.getUserDetails(); // includes user_id, user_name, and user_email
    List<Map<String, Object>> filteredListUser = null;

    return filteredListUser;
}

Что я хотел бы сделать, это сравнить эти два и вернуть новое List<Map<String, Object>>.

Сравнение, которое я хотел бы сделать, показано в качестве примера:


Допустим,

List<String> listId = 
    [
        "8000",
        "8002",
        "8004",
        "8006",
        "8010",
        "8012",
        "8014",
        "8016",
        "8018",
        "8020",
        "8022",
        "8024"
    ]
List<Map<String, Object>> listUser =
    [
      {
        "USER_ID": "8001",
        "USER_NAME": "username1",
        "USER_MAIL": "email1@foo.com"
      },
      {
        "USER_ID": "8002",
        "USER_NAME": "username2",
        "USER_MAIL": "email2@foo.com"
      },
      {
        "USER_ID": "8003",
        "USER_NAME": "username3",
        "USER_MAIL": "email3@foo.com"
      },
      {
        "USER_ID": "8004",
        "USER_NAME": "username4",
        "USER_MAIL": "email4@foo.com"
      },
      {
        "USER_ID": "8005",
        "USER_NAME": "username5",
        "USER_MAIL": "email5@foo.com"
      },
      {
        "USER_ID": "8006",
        "USER_NAME": "username6",
        "USER_MAIL": "email6@foo.com"
      },
      {
        "USER_ID": "8007",
        "USER_NAME": "username7",
        "USER_MAIL": "email7@foo.com"
      }
    ]

Я хотел бы вернуть новый фильтрованный List<Map<String, Object>>, который содержит listUser строк, где listUser USER_ID находится в listId (то есть:)

List<Map<String, Object>> filteredListUser =
    [
      {
        "USER_ID": "8002",
        "USER_NAME": "username2",
        "USER_MAIL": "email2@foo.com"
      },
      {
        "USER_ID": "8004",
        "USER_NAME": "username4",
        "USER_MAIL": "email4@foo.com"
      },
      {
        "USER_ID": "8006",
        "USER_NAME": "username6",
        "USER_MAIL": "email6@foo.com"
      }
    ]

Проблема возникает, когда мне нужно сравнить user_id из listUser с listId чтобы проверить, нужно ли мне добавить строку в filteredListUser.

Я бы знал, как это сделать, если бы это были просто два строковых массива, например:

String[] a = {1, 2, 3, 4, 5, 6, 7};
String[] b = {2, 4, 6, 8, 10};

ArrayList<String> c = new ArrayList<String>();

for (int i = 0; i < a.length; i++) {
        if (Arrays.asList(b).contains(a[i])) {
            c.add(a[i]);
   }
}

IЯ думаю, что цикл for также подходит для сравнений List, но я не уверен, как можно сравнить user_id в listUser с listId в List<Map<String, Object>> и List<String>.

В качестве попытки и с точки зрения псевдокода я пытаюсь сделать следующее:

public List<Map<String, Object>> filterMethod() {

    List<String> listId = this.getUserIds(); //includes only the user id's
    List<Map<String, Object>> listUser = this.getUserDetails(); // includes user_id, user_name, and user_email
    List<Map<String, Object>> filteredListUser = null;

    for (int i = 0; i < listUser.length; i++) {
        if (listId.contains(listUser.USER_ID[i])) {
            filteredListUser.add(listUser[i]);
        }
    }
    return filteredListUser;
}

Однако я не совсем уверен, куда идти дальше - буду признателен за любую помощь!

Извиняюсь, если это действительно рудиментарный вопрос - я очень новичок в программировании.Заранее спасибо!

1 Ответ

4 голосов
/ 26 сентября 2019

Я бы повторил List<Map<String, Object>> и проверил бы соответствующее значение для USER_ID, присутствующего в List<String> listId.ниже представлен подход с использованием потоков java-8

List<Map<String, Object>> result = listUser.stream()
                                      .filter(m-> listId.contains(m.get("USER_ID")))
                                      .collect(Collectors.toList());

или с помощью простого цикла for

List<Map<String, Object>> filteredListUser = new ArrayList<>();

for(Map<String, Object> m : listUser) {
        if(listId.contains(m.get("USER_ID"))) {
            filteredListUser.add(m);
        }
    }

Вы также можете сделать это с помощью removeIf, но это изменяет существующую карту

listUser.removeIf(m->!listId.contains(m.get("USER_ID")));
...