4 способа Π½Π°ΠΉΡ‚ΠΈ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹ Π² Java List

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Codippa Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассмотрСны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы поиска Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π² List. Π”ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Π°ΠΌΠΈ ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ элСмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #209. 4 способа Π½Π°ΠΉΡ‚ΠΈ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹ Π² Java List. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простой ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Java - 1

1. ИспользованиС Set

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ способа поиска ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ элСмСнтов Π² Java List с использованиСм Set.
  • Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Java Set ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ArrayList для хранСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ элСмСнтов.
  • ВыполняСм ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ Ρ†ΠΈΠΊΠ» ΠΏΠΎ списку.
  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² спискС добавляСм Π² Set, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ add().
  • Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ add() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½, ΠΈ false, Ссли элСмСнт ΡƒΠΆΠ΅ присутствовал Π² Set.
  • Если элСмСнт ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² Set, ΠΎΠ½ являСтся Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠΌ. Π’ΠΎΠ³Π΄Π° ΠΌΡ‹ добавляСм Π΅Π³ΠΎ Π² ArrayList.
  • Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ArrayList Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всС ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ элСмСнты ΠΈΠ· исходного списка (List).
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, основанной Π½Π° этом Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅, ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅.
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Set<Integer> set = new HashSet<>();
List<Object> duplicates = new ArrayList<>();
numbers.forEach(n -> {
  if (!set.add(n)) {
    duplicates.add(n);
  }
});
System.out.println("Duplicate elements: " + duplicates);
Π’Ρ‹Π²ΠΎΠ΄:
Duplicate elements: [3, 1, 2]
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° List ΠΌΡ‹ использовали ΠΌΠ΅Ρ‚ΠΎΠ΄ forEach(), Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ.

2. ИспользованиС Map

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ этапы Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° для этого способа поиска Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π² List.
  • Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Map ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ArrayList для хранСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ элСмСнтов.
  • ΠšΠ»ΡŽΡ‡Π°ΠΌΠΈ этого Map Π±ΡƒΠ΄ΡƒΡ‚ элСмСнтами исходного List, Π° Π΅Π³ΠΎ значСния Π±ΡƒΠ΄ΡƒΡ‚ количСством ΠΈΡ… Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π² List.
  • Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ» ΠΏΠΎ списку (List).
  • Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² List ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, сущСствуСт Π»ΠΈ ΠΎΠ½ ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ Π² Map, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ containsKey().
  • Если ΠΎΠ½ сущСствуСт, ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Map ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ снова, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ put().
  • Если ΠΎΠ½ Π½Π΅ сущСствуСт, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² Map со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1.
  • ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ списка всС элСмСнты Map со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ большС 1 становятся Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Π°ΠΌΠΈ.
  • НаконСц, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ Map ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‚Π΅ элСмСнты, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС 1, Π² список для хранСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ элСмСнтов.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅:
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Map<Integer, Integer> countMap = new HashMap<>();
List<Object> duplicates = new ArrayList<>();
numbers.forEach(n -> {
  if (countMap.containsKey(n)) {
    countMap.put(n, countMap.get(n) + 1);
  } else {
    countMap.put(n, 1);
  }
});
countMap.keySet().forEach(k -> {
  if(countMap.get(k)> 1) {
    duplicates.add(k);
  }
});

3. ИспользованиС Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² (nested loops)

Если вас попросят Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ элСмСнты Π² спискС Π±Π΅Π· использования ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ классов Collection, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Set, Map ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, Ρ‚ΠΎ этот способ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½. Π­Ρ‚Π°ΠΏΡ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°:
  • Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ» ΠΏΠΎ списку (List).
  • ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ†ΠΈΠΊΠ» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ ΠΈ снова ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ всС дСйствия для поиска ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части списка.
  • Если Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт Ρ†ΠΈΠΊΠ»Π° Ρ€Π°Π²Π΅Π½ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ элСмСнтов, ΠΎΠ½ являСтся Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠΌ.
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, написанная ΠΏΠΎ этому Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ, выглядит Ρ‚Π°ΠΊ:
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
List<Object> duplicates = new ArrayList<>();
for (int i = 0; i < numbers.size() - 1; i++) {
  for (int j = i + 1; j < numbers.size(); j++) {
    if (numbers.get(i).equals(numbers.get(j))) {
      duplicates.add(numbers.get(i));
    }
  }
}

4. ИспользованиС Java Stream

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ основан Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Java 8 ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
  • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ List Π² ΠΏΠΎΡ‚ΠΎΠΊ (Stream).
  • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊ Π² Map, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ collect(). НапримСр, ΠΊΠ»ΡŽΡ‡ (key) β€” это ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² спискС, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (value) β€” это количСство Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ collect() возвращаСтся, ΠΈ Map ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Collector Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. РСализация Collector опрСдСляСт ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ значСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Map.
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ»ΡŽΡ‡ΠΈ Map Π±Ρ‹Π»ΠΈ элСмСнтами списка (List), Π° Π΅Π³ΠΎ значСния Π±Ρ‹Π»ΠΈ числом ΠΈΡ… Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ, для создания ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Collectors.groupingBy().
  • Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Map Π±ΡƒΠ΄Π΅Ρ‚ создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ groupingBy(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ entrySet() для получСния Π½Π°Π±ΠΎΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Map.Entry.
  • ΠžΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠΉΡ‚Π΅ записи Π½Π° основС значСния (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ количСства Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ) большС 1.
  • Π‘ΠΎΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ записи с ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Map<Object, Long> map = numbers.
                        stream().
                        collect(
                          Collectors.
                          groupingBy(n -> n, Collectors.counting())
                        );
List<Object> duplicates = map.
                          entrySet().
                          stream().
                          filter(e -> e.getValue() > 1).
                          map(e -> e.getKey()).
        collect(Collectors.toList());
ΠœΠ΅Ρ‚ΠΎΠ΄ groupingBy() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π½Π° основС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π². Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:
  • ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ прСдоставляСтся Π² Π²ΠΈΠ΄Π΅ лямбда-выраТСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ groupingBy() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Function, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ интСрфСйсом.
  • Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ идСнтичности n -> n, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅ΠΌ элСмСнты списка ΠΏΠΎ ΠΈΡ… значСниям.
  • Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ groupingBy() β€” это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ элСмСнты Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹.
  • Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Collectors.counting(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Map, содСрТащий количСство ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² спискС.
Π’ ΠΈΡ‚ΠΎΠ³Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Map Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ подсчСт Ρ‚ΠΎΠ³ΠΎ, сколько Ρ€Π°Π· ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт появляСтся Π² спискС. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ Map с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° filter(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ элСмСнты, количСство ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС 1, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Π°ΠΌΠΈ.

Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простой ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Java

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Medium Π­Ρ‚ΠΎ руководство ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π° Java простой ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€ для воспроизвСдСния Π°ΡƒΠ΄ΠΈΠΎ- ΠΈ Π²ΠΈΠ΄Π΅ΠΎΡ„Π°ΠΉΠ»ΠΎΠ². ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #209. 4 способа Π½Π°ΠΉΡ‚ΠΈ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹ Π² Java List. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простой ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Java - 2Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ способом Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Java для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JavaFX ΠΈ Π½Π°Π±ΠΎΡ€ инструмСнтов для графичСского ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса (GUI) для Java.

Π¨Π°Π³ 1: Настройка ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Для Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ наш Java-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π’ качСствС IDE ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Eclipse, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с любой IDE ΠΏΠΎ своСму Π²Ρ‹Π±ΠΎΡ€Ρƒ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Java ΠΈ Π½Π°Π·ΠΎΠ²ΠΈΡ‚Π΅ Π΅Π³ΠΎ β€œMediaPlayer”. Нам Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ JavaFX Π² наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Для этого ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² свойства ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ JavaFX Π² ΠΏΡƒΡ‚ΡŒ сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π¨Π°Π³ 2: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ создадим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс для нашСго ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π°. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ простой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ воспроизвСдСния, ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ остановки ΠΈ панСлью ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π°, Π³Π΄Π΅ отобраТаСтся Π²ΠΈΠ΄Π΅ΠΎ- ΠΈΠ»ΠΈ Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ воспроизвСсти. Для нашСго интСрфСйса ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚ BorderPane. ПанСль ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ BorderPane, Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ воспроизвСдСния ΠΈ остановки β€” Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части BorderPane. Π’ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;

public class MediaPlayerApp extends Application {

    private MediaPlayer mediaPlayer;

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Media Player");

        Button playButton = new Button("Play");
        playButton.setOnAction(e -> mediaPlayer.play());

        Button stopButton = new Button("Stop");
        stopButton.setOnAction(e -> mediaPlayer.stop());

        BorderPane borderPane = new BorderPane();

        Media media = new Media("http://www.example.com/sample.mp4");
        mediaPlayer = new MediaPlayer(media);
        MediaView mediaView = new MediaView(mediaPlayer);
        borderPane.setCenter(mediaView);
        borderPane.setBottom(stopButton);
        borderPane.setRight(playButton);

        Scene scene = new Scene(borderPane, 600, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Π’ этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ создаСм Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ: playButton ΠΈ stopButton. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ воспроизвСдСния ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ play() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mediaPlayer. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ остановки ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ stop() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mediaPlayer. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Media с URL-адрСсом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄Π΅ΠΎΡ„Π°ΠΉΠ»Π° ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ mediaPlayer с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Media. НаконСц, ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MediaView с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ MediaPlayer ΠΈ устанавливаСм Π΅Π³ΠΎ Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π° BorderPane.

Π¨Π°Π³ 3. ВСстированиС ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас настроСн ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, запустив ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Когда ΠΌΡ‹ запускаСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π°, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ воспроизвСдСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ воспроизвСдСниС Π²ΠΈΠ΄Π΅ΠΎΡ„Π°ΠΉΠ»Π°. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ остановки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ воспроизвСдСниС Π²ΠΈΠ΄Π΅ΠΎΡ„Π°ΠΉΠ»Π°.

Π¨Π°Π³ 4: Настройка ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Π΄ΠΈΠ°ΠΏΠ»Π΅Π΅Ρ€, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎ своСму вкусу. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ воспроизводимый Π²ΠΈΠ΄Π΅ΠΎΡ„Π°ΠΉΠ», Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ для Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ громкости ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ выполнСния, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ…ΠΎΠ΄ воспроизвСдСния Π²ΠΈΠ΄Π΅ΠΎ.