Как получить необычные элементы из ArrayList на основе заказа

1

Я сравниваю два списка ArrayLists на основе заказа

Размер total_list всегда будет больше, чем sub_list

import java.util.ArrayList;

import org.json.JSONException;

public class MrTest {

    public static void main(String args[]) throws JSONException
    {



        ArrayList<String> total_list = new ArrayList<String>();
        ArrayList<String> sub_list = new ArrayList<String>();

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

        total_list.add("Beverages");
        total_list.add("Hot");
        total_list.add("Sai1");
        total_list.add("Sai2");
        total_list.add("Sai3");


        sub_list.add("Sai1");
        sub_list.add("Sai2");
        sub_list.add("Sai3");




        for(int i=0;i<total_list.size();i++)
        {

            String total_name = total_list.get(i);
            String sub_name = sub_list.get(i);

            if(total_name.equals(sub_name))
            {

            }
            else
            {
                un_common_list.add(total_name);
            }


        }


        System.out.println(un_common_list);
    }
}

я осознаю

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.get(ArrayList.java:382)
    at MrTest.main(MrTest.java:35)

где, как я ожидаю, выход

[Beverages, Hot]

Может ли кто-нибудь помочь мне, как получить Output as

[Beverages, Hot] in this case ??
  • 0
    Списки массивов имеют разные размеры, вы не можете использовать i для обоих.
  • 0
    for (int i = 0; i <total_list.size (); i ++) {String total_name = total_list.get (i); Строка sub_name = sub_list.get (i); } если общий размер списка составляет 200, а подсписок меньше, конечно, вы получите эту ошибку
Показать ещё 1 комментарий
Теги:

5 ответов

2

Я думаю, вы просто хотите:

total_list.removeAll(sub_list);

Если вы хотите сохранить total_list:

List<String> uncommon = new ArrayList<>(total_list);
uncommon.removeAll(sub_list);
  • 1
    Нет, я хочу получить общие элементы, основанные только на порядке вставки.
  • 0
    это также изменило total_list.
Показать ещё 1 комментарий
1

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

boolean inlist=false;
 for(int i=0;i<total_list.size();i++)
    {

        String total_name = total_list.get(i);

        for(int k=0;k<sub_list.size();k++)
        {
            String sub_name = sub_list.get(k);


            if(total_name.equals(sub_name))
            {
              inlist=true;
            }

        }
       if (!inlist){un_common_list.add(total_name);}
       inlist=false;
  }
  • 0
    Вывод, который я получаю: [Напитки, Напитки, Напитки, Горячие, Горячие, Горячие, Sai1, Sai1, Sai2, Sai2, Sai3, Sai3]
  • 0
    Где, как я ожидаю выхода как [Напитки, Горячие]
Показать ещё 3 комментария
0

я бы пошел с 1 циклом, сначала сделаю копию total_list, используя System.arraycopy, в un_common_list, затем перебирает sub_list и удаляет элементы, присутствующие в sub_list из un_common_list, порядок должен быть сохранен

однако removeAll() также должен сохранить порядок, просто используйте экземпляр массива

0

если порядок вставки должен поддерживаться, тогда можно попробовать это условие

for(int i=0;i<total_list.size() && i<sub_list.size();i++)
  • 0
    Спасибо, я вижу, что вывод [Beverages, Hot, Sai1], я не знаю, почему Sai1 печатается в выводе.
  • 0
    теперь ниже, чтобы использовать этот un_common_list.removeAll (sub_list); .... вне обоих для цикла for
0
    for(int i=0;i<total_list.size();i++) 
    // Total_list size is 5
    {

        String total_name = total_list.get(i);
        String sub_name = sub_list.get(i);
        // sub_list size is 3, 
        // but you are calling sublist.get(3), sublist.get(4) and sublist.get(5)
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню