2 listy z liczbami. Wypisanie liczb z listy1 i listy2 bez powtórzeń. Zrobienie zadania poprzez algorytm.

0

public static void main(String[] args) {

    List<Integer> lista1 = new ArrayList<>();
    lista1.add(1);
    lista1.add(1);
    lista1.add(2);
    lista1.add(2);

    List<Integer> lista2 = new ArrayList<>();
    lista2.add(1);
    lista2.add(1);
    lista2.add(1);
    lista2.add(3);
    lista2.add(4);

(początkujący)
Siemka, męczę się od jakiegoś czasu z liczbami bez powtórzeń. Jak użyć pętli krok po kroku ? bo chyba tym będzie najlepiej. Tak aby liczby nie powtarzały się przy końcowym wypisaniu oby dwóch list. Czyli jeśli w lista1 jest 1x2 i lista2 zawiera 1x3 to i tak finalnie jedyna zostanie raz wypisana.

2

Wrzuć liczby do HashSet'a, to się nie powtórzą ;)

-- Edytka --
Chcąc wyświetlić zawartość robisz z list streama i przed wyświetleniem robisz https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#distinct

0

Już tłumacze aby jaśniej było. Mamy dwie listy integerow, i musze napisać algorytm ktory wypisze liczby ktore sa na obu listach, bez potworzen!
// (czyli jak np: jedynka jest 5x na liscie nr 1 i 2x na liscie nr2 to jedynke ma wypisac tylko raz!) HashSet'a nie mogę użyć - takie ćwiczenie

3

To tak na szybko:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> lista1 = new ArrayList<>();
        lista1.add(1);
        lista1.add(1);
        lista1.add(2);
        lista1.add(2);

        List<Integer> lista2 = new ArrayList<>();
        lista2.add(1);
        lista2.add(1);
        lista2.add(1);
        lista2.add(3);
        lista2.add(4);

        List<Integer> result = getCommonsNumbers(lista1, lista2);
        System.out.println("Pierwsza lista: " + lista1);
        System.out.println("Druga lista: " + lista2);
        System.out.print("Wspólne elementy obu list: ");
        result.forEach(System.out::println);

}
    public static List<Integer> getCommonsNumbers(List<Integer> firstList, List<Integer> secondList){
        List<Integer> result = new ArrayList<>();
        for(Integer number : firstList){
            if(secondList.contains(number)){
                result.add(number);
            }
        }
        for(Integer number : secondList){
            if(firstList.contains(number)){
                result.add(number);
            }
        }
        return result.stream().distinct().collect(Collectors.toList());
    }
}

screenshot-20210912133210.png

3

No to masz na szybko:


import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        List<Integer> lista1 = new ArrayList<>();
        lista1.add(1);
        lista1.add(1);
        lista1.add(2);
        lista1.add(2);

        List<Integer> lista2 = new ArrayList<>();
        lista2.add(1);
        lista2.add(1);
        lista2.add(1);
        lista2.add(3);
        lista2.add(4);

        List<Integer> result = getDistinctNumbersFromLists(lista1, lista2);
        System.out.println("Pierwsza lista: " + lista1);
        System.out.println("Druga lista: " + lista2);
        System.out.println("Elementy obu list bez powtórzeń: ");
        result.forEach(System.out::println);

}
    public static List<Integer> getDistinctNumbersFromLists(List<Integer> firstList, List<Integer> secondList){
        return Stream.of(firstList, secondList).flatMap(Collection::stream)
                .distinct()
                .collect(Collectors.toList());
    }
}

screenshot-20210912134923.png

-- Edytka --

4
       ...
        lista1.addAll(lista2);
        lista1.stream().distinct().forEach(System.out::println);
0

Pytanie na co to jest ćwiczenie. Na Java, czy raczej algorytmika.
W Java da się to zrobić prosto masz odpowiedzi wyżej. Jak algorytmika, to już trochę zabawy będzie.
Naiwnie:
Utwórz listę, dodawaj do niej kolejne elementy, sprawdzając wcześniej czy już istnieje.

Problem w tym, że jak wrzucisz do każdej listy po milionie elementów, to może to trwać długo, bo dla każdego dodanego elementu musisz sprawdzić wszystkie poprzednio dodane. Czyli dla 2 milionów elementów dla ostatniego dodawanego, będziesz musiał 2e6 już dodanych. łącznie wyjdzie ci 2e12 sprawdzeń, co trochę trwa.

Nieco lepiej:

  • Posortuj obie listy
  • krocz po nich i dodawaj mniejszy z elementów, ale wyłącznie jeżeli jest jednocześnie większy od ostatniego już dodanego.

Złożoność zależy od obranej metody sortowania, ale skoro to są liczby, to wystarczy je zliczyć, więc jeden przebieg dla każdej z list pozwoli na uzyskanie posortowanego wyniku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1