Porównywanie elementów z dwóch kolekcji.

0

Witam, mam taki pewien problem.
Mam dwie kolekcje

Collection<Point> collectionPointsF1;
Collection<Point> collectionPointsF2;

Klasa Point ma dwa pola int x i int y.
Chciałbym porównywać w jednym czasie wartości kolejnych elementów list po y.
Np jak mam:
collectionPointsF1 = { 1, 4, 5, 8, 10}
collectionPointsF2 = { 2, 3, 6, 9}
Na początku chcę porównać oba elementy, wykonać operacje rysowania dla mniejszego elementu, czyli dla 1, potem "wskaźnik" przechodzi na 4, ale 2 jest mniejsze i tutaj rysuję, potem na 3 bo jest mniejsze od 4 i tak dalej.
Mam zrobić tak?

for(Point p : collectionPointsF1)
{
    for(Point p1 : collectionPointsF2)
    {
        //rysowanie         
    }
}

Tylko zdaję sobie z tego sprawę że to będzie wolno działało bo środkowa pętla będzie wykonywać od początku kolekcji, a nie od danego momentu.

0

W przykładzie, który podałeś kolekcje są posortowane. Tak jest zawsze, czy to przypadek?

0

Dałem taki przypadek, ale ogólnie zamierzam wprowadzać rosnąco tak jak w przykładzie, tylko nie wiem czy to się później odczytuje z listy to jest tak samo jak się wprowadziło.

0

Można tak:

public class Test {
    public static void process(){
        List<Integer> list1, list2; 
        // tutaj zapełniasz listy

        Stream.of(list1, list2).flatMap(l -> l.stream()).sorted(comparatorIfNeeded).forEach(consume);
    }

    public static void consume(Integer i){
        // coś robisz z elementem
    }
}

Ważne jest, żeby typ elementów miał poprawnie zaimplementowane metody equals i hashCode.

0
wartek01 napisał(a):

Można tak:

public class Test {
  public static void process(){
      List<Integer> list1, list2; 
      // tutaj zapełniasz listy

      Stream.of(list1, list2).flatMap(l -> l.stream()).sorted(comparatorIfNeeded).forEach(consume);
  }

  public static void consume(Integer i){
      // coś robisz z elementem
  }
}

Ważne jest, żeby typ elementów miał poprawnie zaimplementowane metody equals i hashCode.

A mógłbyś powiedzieć o co tutaj dokładnie chodzi?

1

Po kolei: z tego co zrozumiałem, to chcesz de facto z dwóch ciągów liczbowych zrobić jeden, posortować go rosnąco i dla każdego takiego elementu wykonać cośtam. Czyli coś, co bardzo wygodnie robi się za pomocą Stream API.

Stream.of(list1, list2) // tworzysz Stream<List<Integer>> - liczba elementów dwa (dwie listy)
    .flatMap(l -> l.stream()) // mapujesz Stream<List<Integer>> na Stream<Integer> - czyli już w tym momencie masz list1.size()+list2.size() elementów
    .sorted(comparatorIfNeeded) // metoda Stream.sorted sortuje ci wszystkie elementy w strumieniu. "comparatorIfNeeded" - można podać mu obiekt typu Comparator<? extends Integer> jeśli chcesz posortować w jakiś sposób
    .forEach(consume); // każdy element z Stream zostanie skonsumowany

Więcej o streamach:
http://www.oracle.com/technet[...]ava-se-8-streams-2177646.html

0

O dzięki :D
Postaram się to ogarnąć :D

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