JavaRush /Java блог /Random /Кофе-брейк #256. Как выполнять сортировку объектов в Arra...

Кофе-брейк #256. Как выполнять сортировку объектов в ArrayList. Класс AtomicInteger в Java

Статья из группы Random

Как выполнять сортировку объектов в ArrayList

Источник: Medium С помощью этого руководства вы научитесь выполнять сортировку объектов в ArrayList на языке Java. Кофе-брейк #256. Как выполнять сортировку объектов в ArrayList. Класс AtomicInteger в Java - 1ArrayList — это предопределенный класс, предоставляемый платформой Collection и импортированный из пакета java.util. И поскольку этот класс часто используется Java-разработчиками, в нем существуют сразу три способа сортировки объектов:
  1. Использование метода Collections.sort().
  2. Использование метода Java 8 ArrayList sort().
  3. Использование метода sorted() в Java 8.

Использование метода Collections.sort()

Мы можем сортировать объекты в ArrayList Java с помощью двух методов sort() класса Collections.
  • public static void sort(List l): используется для сортировки элементов списка в соответствии с естественным порядком сортировки по умолчанию. При этом элементы списка должны быть однородными и сопоставимыми, иначе мы получим исключение ClassCastException. Класс списка не должен содержать значение null, иначе мы получим исключение NullPointerException.
  • public static void sort(List I, Comparator c): этот метод используется для сортировки элементов списка в соответствии с настроенным порядком сортировки.
Сейчас мы взглянем на пример сортировки объектов ArrayList в соответствии с естественным порядком сортировки по умолчанию. В данном примере мы можем отсортировать объекты ArrayList в порядке возрастания.

import java.util.ArrayList;
import java.util.Collections;
public class SpringJava{
public static void main(String args[]){
//создание ArrayList
ArrayList al=new ArrayList();
al.add("A");
al.add("Q");
al.add("Z");
al.add("K");
//al.add(new Integer(10));//ClassCastException
//al.add(null);//NullPointerException
System.out.println("Before Sorting: " + al);
//сортировка ArrayList в порядке возрастания
Collections.sort(al);
System.out.println("After Sorting: " + al);
    }
}
Вывод:
До сортировки: [A, Q, Z, K] После сортировки: [A, K, Q, Z]

Пример сортировки объектов ArrayList в соответствии с настроенным порядком

В этом примере мы отсортируем объекты ArrayList в порядке убывания.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class SpringJava{
public static void main(String args[]){
//создание ArrayList 
ArrayList al=new ArrayList();
al.add("A");
al.add("Q");
al.add("Z");
al.add("K");
al.add(new Integer(10));
//al.add(null);//NullPointerException
System.out.println("Before Sorting: " + al);
//сортировка ArrayList в порядке убывания
Collections.sort(al, new MyComparator());
System.out.println("After Sorting: " + al);
    }
}
class MyComparator implements Comparator{
public int compare(Object obj1, Object obj2){
String s1=obj1.toString();
String s2=obj2.toString();
return s2.compareTo(s1);
 }
}
Вывод:
До сортировки: [A, Q, Z, K, 10] После сортировки: [Z, Q, K, A, 10]

Использование метода Java 8 ArrayList of sort()

Начиная с Java 8, мы можем использовать метод sort() для сортировки объектов ArrayList в порядке возрастания и убывания.

public void sort(Comparator c)

Пример сортировки объектов ArrayList в порядке возрастания


import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
public class SpringJava{
public static void main(String args[]){
//создание ArrayList
ArrayList<String> al=new ArrayList<>();
al.add("A");
al.add("Q");
al.add("Z");
al.add("K");
System.out.println("Before Sorting: " + al);
//сортировка ArrayList в порядке возрастания
al.sort(Comparator.naturalOrder());
System.out.println("After Sorting: " + al);
    }
}
Вывод:
До сортировки: [A, Q, Z, K] После сортировки: [A, K, Q, Z]

Пример сортировки объектов ArrayList в порядке убывания


import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
public class SpringJava{
public static void main(String args[]){
//создание ArrayList
ArrayList<String> al=new ArrayList<>();
al.add("A");
al.add("Q");
al.add("Z");
al.add("K");
System.out.println("Before Sorting: " + al);
//сортировка ArrayList в порядке убывания
al.sort(Comparator.reverseOrder());
System.out.println("After Sorting: " + al);
    }
}
Вывод:
До сортировки: [A, Q, Z, K] После сортировки: [Z, Q, K, A]

Использование метода sorted() Java 8

Начиная с Java 8, мы можем использовать метод sorted() Stream API для сортировки объектов ArrayList в порядке возрастания и убывания. В интерфейсе Collection метод stream() добавлен в Java 8 и последующих версиях. Метод stream() возвращает интерфейс Stream.

default Stream<E> stream()

Пример сортировки ArrayList типа Integer с использованием метода sorted() Stream API


import java.util.ArrayList;
import java.util.Comparator;
import java.util.stream.Collectors;
public class SpringJava{
public static void main(String[] args) {
//создание ArrayList
ArrayList<Integer> al = new ArrayList<>();
al.add(10);
al.add(60);
al.add(40);
al.add(50);
al.add(70);
System.out.println("Before Sorting:"+al);
//сортировка ArrayList в порядке возрастания
ArrayList<Integer> sortedList = al
                .stream()
                .sorted()
                .collect(Collectors.toCollection(ArrayList::new));
//печать ArrayList
System.out.println("Sorting in Ascending order:"+sortedList);
//сортировка ArrayList в порядке убывания
ArrayList<Integer> reverseSortedList = al.stream()
                .sorted(Comparator.reverseOrder())
                .collect(Collectors.toCollection(ArrayList::new));
//печать ArrayList
System.out.println("Sorting in Descending order:"+reverseSortedList);
    }
}
Вывод:
До сортировки:[10, 60, 40, 50, 70] сортировка в порядке возрастания:[10, 40, 50, 60, 70] сортировка в порядке убывания:[70, 60, 50, 40, 10]

Сортировка ArrayList из нескольких полей с помощью Stream API


import java.util.ArrayList;
import java.util.Comparator;
import java.util.stream.Collectors;
class Person{
private int id;
private String fName;
private String lName;
Person(int id, String fName, String lName){
this.id=id;
this.fName=fName;
this.lName=lName;
}
    public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getFName() {
    return fName;
}
public void setFName(String fName) {
    this.fName = fName;
}
public String getLName() {
    return lName;
}
public void setLName(String lName) {
    this.lName = lName;
  }
}
public class SpringJava{
public static void main(String[] args) {
//создание ArrayList
ArrayList<Person> al = new ArrayList<>();
al.add(new Person(1,"Peter","Parker"));
al.add(new Person(2,"Robert","John"));
al.add(new Person(3,"Bill","Smith"));
System.out.println("----Before Sorting----");
for(Person p:al){
    System.out.println("Person:"+p.getId()+","+p.getFName()+","+p.getLName());
}
//сравнение первого и последнего имени
Comparator<Person> compareByName = Comparator
                        .comparing(Person::getFName)
                        .thenComparing(Person::getLName);
     
ArrayList<Person> sortedPerson = al.stream()
                    .sorted(compareByName)
                    .collect(Collectors.toCollection(ArrayList::new));
System.out.println("----After Sorting----");
for(Person p:sortedPerson){
    System.out.println("Person:"+p.getId()+","+p.getFName()+","+p.getLName());
     }
   }
}
Вывод:
До сортировки: Person:1,Peter,Parker Person:2,Robert,John Person:3,Bill,Smith После сортировки: Person:3,Bill,Smith Person:1,Peter,Parker Person:2,Robert,John

Часто задаваемые вопросы

Вопрос 1. Какой самый простой способ сортировки данных в ArrayList целых чисел? Ответ. Проще всего сортировать данные в целых числах можно, используя метод sort() класса Collections в Java. Вопрос 2. Какой класс используется для сортировки элементов ArrayList? Ответ. Класс Collections. Вопрос 3. Как отсортировать объекты ArrayList в порядке убывания? Ответ. Используя метод sort() класса Collections в Java, мы можем отсортировать объекты ArrayList в порядке убывания.

Класс AtomicInteger в Java

Источник: Medium Благодаря этой статье вы сможете получить полное представление о предназначении с вариантах применения класса AtomicInteger в Java. Класс AtomicInteger в Java является частью пакета java.util.concurrent.atomic, который предоставляет набор атомарных переменных, поддерживающих атомарные операции. Атомарная операция — это операция, которая выполняется как единый непрерывный блок, обеспечивающий безопасность потоков в многопоточной среде. Класс AtomicInteger предназначен для выполнения атомарных операций с целочисленными значениями. Класс AtomicInteger предоставляет методы для выполнения таких операций, как:
  • get(): Атомарно получает текущее значение AtomicInteger.
  • set(int newValue): устанавливает значение AtomicInteger указанного целого числа.
  • getAndSet(int newValue): атомарно устанавливает значение в новое целое число и возвращает старое значение.
  • compareAndSet(int expect, int update): атомарно сравнивает текущее значение с ожидаемым значением и обновляет его, если сравнение прошло успешно.
  • Различные атомарные арифметические операции, такие как incrementAndGet(), decrementAndGet(), addAndGet(int delta) и так далее.
Вот пример использования AtomicInteger для выполнения атомарных добавлений:

package com.tipsontech.demo;

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    public static void main(String[] args) {
        // Создаем AtomicInteger с начальным значением 5
        AtomicInteger atomicInt = new AtomicInteger(5);
        
        // Демонстрация метода get()
        int currentValue = atomicInt.get();
        System.out.println("Current Value: " + currentValue);
        
        // Демонстрация метода set(int newValue)
        atomicInt.set(10);
        System.out.println("Set to 10. Current Value: " + atomicInt.get());
        
        // Демонстрация метода getAndSet(int newValue) 
        int oldValue = atomicInt.getAndSet(20);
        System.out.println("Old Value (getAndSet): " + oldValue);
        System.out.println("New Value (getAndSet): " + atomicInt.get());
        
        // Демонстрация метода compareAndSet(int expect, int update)
        boolean updated = atomicInt.compareAndSet(20, 30);
        System.out.println("Updated: " + updated);
        System.out.println("Current Value (compareAndSet): " + atomicInt.get());
        
        // Демонстрация атомарных арифметических операций
        int incrementedValue = atomicInt.incrementAndGet();
        System.out.println("Incremented Value: " + incrementedValue);
        
        int decrementedValue = atomicInt.decrementAndGet();
        System.out.println("Decremented Value: " + decrementedValue);
        
        int addedValue = atomicInt.addAndGet(5);
        System.out.println("Added Value: " + addedValue);
    }
}
Вывод приведенного выше кода:
Текущее значение: 5 Установлено на 10. Текущее значение: 10 Старое значение (getAndSet): 10 Новое значение (getAndSet): 20 Обновлено: true Текущее значение (compareAndSet): 30 Увеличенное значение: 31 Уменьшенное значение: 30 Добавленное значение: 35
Помимо AtomicInteger, Java предоставляет аналогичные атомарные классы для других типов данных, таких как:
  • AtomicLong: для атомарных операций над значениями long.
  • AtomicBoolean: для атомарных операций над значениями boolean.
  • AtomicReference: для атомарных операций над ссылочными типами (объектами).
  • Различные классы атомарных массивов, такие как AtomicIntegerArray, AtomicLongArray и AtomicReferenceArray для атомарных операций с массивами соответствующих типов.
Все эти атомарные классы полезны для создания потокобезопасных, параллельных структур данных, а также для обеспечения атомарного выполнения операций с общими данными без явной синхронизации с использованием блокировок.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ