Примеры по ArrayList и Generics

Открыта
Примеры по ArrayList и Generics - 1

— Давай-ка я начну с действительно полезных вещей. Сейчас ты увидишь несколько полезных примеров работы с ArrayList и Generics:

— Пример 1:

Ввод списка целых чисел с клавиатуры
public static void main(String[] args) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in) );
    ArrayList<Integer> list = new ArrayList<Integer>() ;

    while (true)
    {
        String s = reader.readLine();
        if (s.isEmpty()) break;
        list.add(Integer.parseInt(s));
    }
}

— Пример 2:

То же, чётные числа добавляются в конец списка, нечётные — в начало.
public static void main(String[] args) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();

    while (true)
    {
        String s = reader.readLine();
        if (s.isEmpty()) break;

        int x = Integer.parseInt(s);
        if (x % 2 == 0)  //проверяем, что остаток от деления на два равен нулю
            list.add(x);          //добавление в конец
        else
            list.add(0, x);      //вставка в начало
    }
}

— Пример 3:

Удаление всех чисел больше 5:
public static void main(String[] args) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in) );
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(1);
    list.add(7);
    list.add(11);
    list.add(3);
    list.add(15);

    for (int i = 0; i < list.size(); ) //убрали увеличение i внутрь цикла
    {
        if (list.get(i) > 5)
            list.remove(i);  //не увеличиваем i, если удалили текущий  элемент
        else
            i++;
    }
}

— Пример 4:

Разделение массива на два — чётных и нечётных чисел
public static void main(String[] args) throws IOException
{
    //статическая инициализация массива
    int[] data = {1, 5, 6, 11, 3, 15, 7, 8};

    //создание списка, где все элементы должны быть типа Integer
    ArrayList<Integer> list = new ArrayList<Integer> ();

    //заполнение списка из массива
    for (int i = 0; i < data.length; i++) list.add(data[i]);

    ArrayList<Integer> even = new ArrayList<Integer>();  //чётные
    ArrayList<Integer> odd = new ArrayList<Integer>();    //нечётные

    for (int i = 0; i < list.size(); i++)
    {
        Integer x = list.get(i);
        if (x % 2 == 0)    //если x - чётное
            even.add(x);   // добавляем x в коллекцию четных чисел
        else
            odd.add(x);    // добавляем x в коллекцию нечетных чисел
    }
}
2
Задача
Java Syntax,  7 уровень,  8 лекция
Недоступна
Набираем код
Внимание! Объявляется набор кода на JavaRush. Для этого включите режим повышенной внимательности, расслабьте пальцы, читайте код и… набирайте его в соответствующем окошке. Набор кода — вовсе не бесполезное занятие, как может показаться на первый взгляд: благодаря ему новичок привыкает к синтаксису и запоминает его (современные IDE редко дают ему это сделать).

— Пример 5:

Слияние списков.
public static void main(String[] args) throws IOException
{
    ArrayList<Integer> list1 = new ArrayList<Integer>();   //создание списка
    Collections.addAll(list1, 1, 5, 6, 11, 3, 15, 7, 8);   //заполнение списка

    ArrayList<Integer> list2 = new ArrayList<Integer>();
    Collections.addAll(list2, 1, 8, 6, 21, 53, 5, 67, 18);

    ArrayList<Integer> result = new ArrayList<Integer>();

    result.addAll(list1);   //добавление всех значений из одного списка в другой
    result.addAll(list2);

    for (Integer x : result)   //быстрый for по всем элементам, только для коллекций
    {
        System.out.println(x);
    }
}

— Круто. И что Диего даст мне сейчас кучу аналогичных задач, да?

— Ага!

Комментарии (228)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Dmitry Shirokov10 уровень, Strezhevoy
17 сентября, 07:48
Набираем код : Вопрос : А разве в этой строчке for (int i = 0; i < data.length; i++) list.add(data[i]); не должны стоять скобки () после data.length ???????
Sergey8 уровень, Барнаул
17 сентября, 15:05
Должны. Опечатка получается...
Aleksandr12 уровень, Санкт-Петербург
18 сентября, 19:07
Не нужны (). Проверьте у себя в IDE.
Artem Boyarshinov20 уровень, Москва
19 сентября, 14:05
Не должны, потому что вызывается поле объекта типа массив, хранящее количество элементов. В случае списков скобки нужны, потому что length() является методом в классе ArrayList.
Sergey12 уровень, Pattaya
29 сентября, 11:53
А откуда у ArrayList вдруг появился метод length() ? ;) Может быть, size() ?
Лёхансан13 уровень, Брест
29 сентября, 19:26
Так data ведь обычный массив (int[] data), а не ArrayList<Integer>
Лёхансан13 уровень, Брест
29 сентября, 19:35
Аааа, так и вы ведь про это же)
Егор Гераськин16 уровень, Саратов
5 октября, 21:14
Не должны, потому что length - ПЕРЕМЕННАЯ объекта Array - обычного массива int []. Чтобы узнать длину строки мы используем МЕТОД length(). Именно в этом отличие - есть скобки или нет - в том что это метод или переменная объекта.
Sam Fisher7 уровень, Москва
9 сентября, 13:42
Пример 5 требует более детального разложения.
Yuriy37 уровень, Санкт-Петербург
20 сентября, 07:44
Класс ArrayList это имплементация (реализация) интерфейса (абстрактного класса без реализации, т.е. такого объекты которого создавать нельзя) List, который наследуется он интерфейса Collections. Т.е. порядок наследования такой: Collections -> List -> ArrayList. Как мы помним дочерний класс может использовать методы родителя. У интерфейса Collections есть метод addAll, позволяющий добавить к объекту несколько элементов. Этот метод используется как эквивалент вот такой инициализации массива:
int[] data = {1, 5, 6, 11, 3, 15, 7, 8};
По хорошему таблице из 5 лекции это должно было бы быть в паре с записью для ArrayList:
ArrayList<Integer> data = new ArrayList<Integer>();
Collections.addAll(data, 1, 5, 6, 11, 3, 15, 7, 8);
Миша Небоярски8 уровень, Питер
1 октября, 12:42
Это Вы помните, что "Как мы помним дочерний класс может использовать методы родителя" а молодежь 7-8 уровня это "мимо проходила" 😁
Yuriy37 уровень, Санкт-Петербург
1 октября, 14:13
Предыдущий коммент я писал как раз на 7 уровне)
Миша Небоярски8 уровень, Питер
2 октября, 13:02
ого, 13 уровней за полтора месяца? Солидно!
Yuriy37 уровень, Санкт-Петербург
2 октября, 14:27
За 13 дней, по уровню в день примерно выходит (3-4 часа).
Денис13 уровень, Москва
2 октября, 22:15
Скорость впечатляет. Мой день на уровень уходит, и то не всегда успеваю. Респект.
barracuda7 уровень, Санкт-Петербург
3 сентября, 13:32
Хотел побольше почитать про Collections, но на Javarush 'kf лекция для меня пока что закрыта. Открыть можно за 26 единиц материи. Жаба душит ))
Роман13 уровень, Минск
4 сентября, 10:32
У меня 326 материй сейчас. Ты думаешь тебе потом не хватит? Сейчас кол-во материй только растет)
Иван Ганжа10 уровень, Москва
24 сентября, 13:10
Вот тебе бесплатная лекция https://javarush.ru/groups/posts/1937-klass-collections
Raccoon1439 уровень, Москва
26 августа, 14:19
вопрос по примеру 1- зачем обьявлять переменную при каждой итерации, почему нельзя обьявить ее до цикла?
Александр Иванников9 уровень, Владивосток
30 августа, 03:11
Удобство + по окончании работы цикла закончится и переменная, что позволит спокойно использовать ее название дальше.
Никита8 уровень, Брест
24 августа, 23:59
Пример 2
Scanner in = new Scanner(System.in);
String s = in.nextLine();
        if (s.isEmpty()) break;
        int x = Integer.parseInt(s);
зачем брать значения строчные и парсить их в инт, если можно сразу nextInt()?
KsArT19 уровень, Харьков
5 сентября, 08:46
Чтобы проверить что введено пустое значение.
progr8 уровень
24 августа, 07:25
Пример 3 Когда мы удалили элемент 7 под индексом 1 получается теперь элемент 11 под индексом 2 станет под индексом 1, то есть заменит элемент 7, я так все понял?
Eiffil19 уровень, Москва
31 августа, 22:23
да, элемент 11 станет под индексом 1.
progr8 уровень
4 сентября, 17:36
и так же получается элемент 11 останется и под индексом 2, верно?
progr8 уровень
4 сентября, 17:37
ой я не туда посмотрел, ошибся
Eiffil19 уровень, Москва
4 сентября, 19:27
нет, не верно (элемент 11 не останется под индексом 11). Элемент 11 станет под индексом 1 на этом витке цикла. Но при следующей итерации цикла он тоже будет удален (т.к. тоже больше, чем 5) и под индексом 1 будет элемент 3.
Eggorke17 уровень
8 августа, 07:40
подскажите можно ли заменить строку if(s.isEmpty()) break; на if(s == null) break; ?
Павел Петров9 уровень
8 августа, 15:15
isEmpty определяет именно пустое значение. А равенство нулю можно присваивать, если берется s.length()==0
omat_kisat20 уровень, MIPS Assembly
9 августа, 08:41
null и isEmpty – это разные вещи. Приходите вы в туалет, а там бумага закончилась. Вот если втулка стоит, то isEmpty. А если и ее нет – то null. Пустая строка – это тоже строка, null же сообщает вам, что такого объекта не существует.
omat_kisat20 уровень, MIPS Assembly
9 августа, 08:43
а в данном примере вы войдете в бесконечный цикл, потому что s всегда будет существовать (!=null).
Николай10 уровень, Санкт-Петербург
15 сентября, 10:36
Павел, s.isEmpty() проверяет s.length на равенство нулю. Если s.isEmpty() возвращает true, то длина строки равна 0, то есть s = "". Как правильно заметил omat_kisat, строка при этом существует (ссылка на объект строки не является null)
Евгений17 уровень, Севастополь
14 июля, 21:07
Я не понимаю, что такое эти дженерики и где они используются. Кто разбирается - подскажите, пожалуйста. Как я понимаю это классы обёртки для примитивных типов
Александр26 уровень, Краснодар
15 июля, 21:24
Если я правильно понял, то вот эти самые "классы обертки" позволяют запихнуть в ArrayList "невпихуемое". Что расширяет возможности для различных манипуляций с числами. Т.е. с Дженериками можно писать логику проще (если дело касается цифр), чем какими-то другими методами. Если я не правильно понял, то пожалуйста поправьте.
Rehau41 уровень
17 июля, 10:13
Просто пользуйся тем что эти дженерики, по русски обобщения, указывают какой тип данных можно записывать в список (ArrayList). Для работы пока хватит. Обобщения будут актуальны для List, Map, Set Это такие скажем, разновидности массивов.
viles201213 уровень
19 июля, 11:31
Если простым языком, то это классы, которые в качестве параметров инициализации своих объектов принимают другие классы. Подобное нужно когда есть одинаковые по смыслу и операциям объекты, но внутри они обращаются с разными (по смыслу) вещами. Пример: поликлиники бывают разные(взрослая, детская, ветеринарная...), но во всех них есть врачи и во всех них лечат (не вдаваемся в подробности какие врачи и как лечат, важно то, что по смыслу есть "общие" для всех поликлиник вещи). Что бы не создавать отдельный класс на каждую поликлинику мы создаем generic класс "поликлиника", и тогда, когда нам нужна ветеринарная поликлиника, мы создаем объект "поликлиника<животное>", а когда взрослая "поликлиника<взрослый>".
Серёжа9 уровень, Новосибирск
19 сентября, 13:44
доходчиво
Alexander Taluevsky17 уровень, Минск
30 июня, 16:10
ребята, подскажите чем отличается
Integer x = list.get(i);
от
int x = list.get(i);
n10z11 уровень, Москва
4 июля, 19:59
Integer и int И, вопрос, что такое куча, она же Heap Стек и куча в Java
Rehau41 уровень
17 июля, 10:15
Ничем не отличается. Это по моему называется автоупаковка.
Rehau41 уровень
17 июля, 10:16
куча это адресное пространство памяти в котором размещаются объекты.А ссылки на объекты размещаются в стеке. В двух словах.
Василий23 уровень, Санкт-Петербург
23 июня, 19:55
Кто мучается с набиранием кода - Ctrl+A, Ctrl+C, Ctrl+V (или Cmd на маке) вам помогут.
Гросу15 уровень, Одесса
5 августа, 21:47
так он не копируется) или вы про интелайджей айджея?
Yurasova Anastasiya22 уровень, Санкт-Петербург
6 августа, 08:20
Копируется, и на винде тоже. Просто выделения не видно. Интеллидж Айдиа тогда уж ;)
Гросу15 уровень, Одесса
6 августа, 11:42
большое спасибо Анастасия я так и сказал интелij ijea