объедините два списка разных объектов

#java #android #list #object #merge

Вопрос:

я использую запросы api, которые возвращают список. -первый запрос api возвращает список объектов, которые содержат (идентификатор пользователя,содержимое,дата,название) -второй ответ возвращает список объектов,которые также содержат (идентификатор пользователя, имя пользователя).

я хочу объединить два списка и отобразить их в одном представлении переработчика, но сохранить имя пользователя вместо идентификатора пользователя.это изображение четко разбивает то, что я хочу. введите описание изображения здесь

прими любую помощь, я действительно застрял в этом, и она мне нужна, Тай .

Редактировать

это первый вызов api :

     followuplist=new ArrayList<>();


    Retrofit retrofit = RetrofitInstance.getRetrofitInstance();
    final Api api = retrofit.create(Api.class);
    Call<List<TraitementTicketModel>> call = api.getfollowup(id, sestoken);
    call.enqueue(new Callback<List<TraitementTicketModel>>() {

        @Override
        public void onResponse(Call<List<TraitementTicketModel>> call, Response<List<TraitementTicketModel>> response) {
            if (!response.isSuccessful()) {
                Toast.makeText(getApplicationContext(), "Something is wrong !! ", Toast.LENGTH_LONG).show();
                Log.e("TAG", "onResponse: something is wrong");


            } else if (response.body() == null) {

                return;
            }

            List<TraitementTicketModel> followups = response.body();


            for (TraitementTicketModel followup : followups) {


                followuplist.add(followup);

            }


            followuplist.add(firstfollowup());
           

        }

        @Override
        public void onFailure(Call<List<TraitementTicketModel>> call, Throwable t) {
            Toast.makeText(getApplicationContext(),"Pas de connextion internet",Toast.LENGTH_LONG).show();
        }
    });
 

это второй вызов api :

       List<User> userList;
      SharedPreferences sp =getApplicationContext().getSharedPreferences("tokenPref", Context.MODE_PRIVATE);
    String sestoken = sp.getString("token","");

    Retrofit retrofit= RetrofitInstance.getRetrofitInstance();
    final Api api= retrofit.create(Api.class);
    Call<List<User>> call = api.getUser(sestoken);
    call.enqueue(new Callback<List<User>>() {
        @Override
        public void onResponse(Call<List<User>> call, Response<List<User>> response) {

            if (response.code() != 200){
                Log.e("TAG", "onResponse: something is wrong" response.code() );



            }
            List<User> users = response.body();



            for (User user : users){

                userList.add(user);
            }

            swipeRefreshLayout.setRefreshing(false);



        }
 

итак, у меня есть два списка, первый из которых :
список подписчиков (идентификатор пользователя,заголовок,содержимое,дата)
и второй :
Список пользователей(идентификатор пользователя,имя пользователя)
но я не знал, что делать после этого, чтобы достичь своей цели

Комментарии:

1. С чем именно вы застряли и что вы сделали до сих пор?

2. Опубликуйте свою лучшую попытку решить эту проблему.

3. Хорошо, я собираюсь отредактировать это

4. Если вы не можете выполнить один вызов, чтобы получить необходимую информацию (которую в SQL было бы легко объединить с идентификатором пользователя, чтобы получить все данные сразу за один вызов), вам следует организовать один из списков в карту, где идентификатор пользователя является ключом, а объект-значением. Тогда было бы легко пробежаться по списку, выполнить поиск на карте и создать свой объединенный объект, но опять же, это похоже на проблему, которую следует решить с помощью API,

Ответ №1:

Ты можешь сделать что-то подобное. В этом примере UserDetails показан объект слева на вашем изображении, UserInfo объект справа и MergeData результат.

Вы должны использовать Kotlin вместо Java, так намного проще манипулировать списками.

  List<MergedData> mergeList(
            List<UserDetails> listUserDetails,
            List<UserInfo> listUserInfo
    ) {

        // Resulting list
        final List<MergedData> result = new ArrayList<>();
        // We iterate through the first list
        for (UserDetails details : listUserDetails) {
            // For each element of the list we will try to find one with the same user id in the other list
            for (UserInfo info : listUserInfo) {
                // if the current element of the second list has the same user id as the current one from the first list, we merge the data in a new object and this object is then added to the result list.
                if (details.getUserId().equals(info.getUserId())) {
                    result.add(
                            new MergedData(
                               info.getName(),
                               details.getContent(),
                               details.getTitre(),
                               details.getDate()
                            )
                    );
                    // Once the object is found it is unnecessary to continue looping though the second list, so we break the for loop.
                    break;
                }
            }
        }
        // Once we finished to iterate through the first list, we return the result.
        return resu<
    }
 

Тот же пример в Котлине:

 fun mergeList(
    listUserDetails: List<UserDetails>,
    listUserInfo: List<UserInfo>
): List<MergedData> =
    listUserDetails.mapNotNull { details ->
        listUserInfo
            .firstOrNull { it.userId == details.userId }
            ?.let { info ->
                MergedData(
                    info.name,
                    details.content,
                    details.titre,
                    details.date
                )
            }
    }