2013-04-04 14 views
6

Jest to prawdopodobnie proste pytanie, ale mam dwie tablice po 1000 elementów każda, nazywane są one posXArray i posYArray. Chcę uporządkować posYArray numerycznie (pierwszy najniższy numer), ale chcę elementy posXArray mieć takie samo działanie stosuje się do nich ...Jak "skopiować" operację macierzy do innej tablicy?

Na przykład, jeśli pierwiastek [56] z posYArray jest najmniejszy, chcę element [56] z posXArray również zostanie przeniesiony do [0].

W jaki sposób jest to realizowane w Javie w łatwy/dobry sposób?

Dziękuję bardzo za pomoc!

Odpowiedz

2

Tworzenie klasy jak:

public class XYPos implements Comparable<XYPos> { 
    int x; 
    int y; 

    @Override 
    public int compareTo(XYPos o) { 
     int res = this.y - o.y; 
     if(res == 0) { 
      res = this.x - o.x; 
     } 
     return res; 
    } 
} 

wówczas:

  1. konwertować 2 tablice w jedną tablicę XYPos
  2. rozwiązać to
  3. zaktualizować swoje 2 oryginalnych tablic z wartościami w posortowana tablica:
+0

Dziękuję za doskonałą odpowiedź! –

8

Ponieważ tablice wydają się zawierać współrzędne X i Y, być może lepszym wyborem jest utworzenie klasy współrzędnych zawierającej obie wartości, implementację Comparable i posiadanie pojedynczej tablicy do sortowania za pomocą wbudowanych algorytmów?

0

Można zastosować dowolnie wybrany algorytm sortowania, wykonać test porównawczy tylko na pierwszym (posXArray), a następnie zamienić pozycję elementów w obu tablicach w tym samym czasie.

+0

Czy to 'łatwy/dobry sposób'? – Andremoniy

+0

Jest to z pewnością możliwość i będzie działać - łatwo: tak myślę, dobrze: zgodziłem się, nie jest (w rzeczywistości głosowałem za jedną z odpowiedzi sugerujących stworzenie klasy) :) – Grim

1

Załóż Integer[] idx o tej samej długości i wypełnić go z cyfr od 0 do 999 (lub cokolwiek), a następnie posortować tę tablicę za pomocą komparatora, który nie

public int compare(Integer a, Integer b) { 
    return posYArray[a] - posYArray[b]; 
} 

To daje tablicę indeksów na innych tablicach , czyli najmniejsza wartość Y będzie wynosić posYArray[idx[0]], a odpowiadająca jej wartość X będzie wynosić posXArray[idx[0]] itp. Jeśli nie chcesz utrzymywać kierunku pośredniego, możesz ponownie zamówić oryginalne tablice według wartości idx.

Jeśli regularnie robisz tego typu rzeczy, możesz spojrzeć na fastutil, która zapewnia typy kolekcji i komparatorów, które działają bezpośrednio na typach pierwotnych, takich jak int, unikając konieczności tworzenia i rozpakowywania liczb całkowitych.

+0

Dziękuję za odpowiedź! –

Powiązane problemy