• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Transpozycja tablicy.

0 głosów
50 wizyt
pytanie zadane 28 listopada 2021 w Java przez xTMx3 Obywatel (1,060 p.)

Witam,

od października jestem na studiach, dopiero 1 semestr i na "podstawach programowania" na pierwszy ogień wzięto Javę. Dostałem niedawno parę zadań, wśród których są dwa dotyczące transpozycji tablic. Z jednym sobie poradziłem, ale  mam problem z drugim. Polecenie brzmi :

Stwórz funkcję, która wykonuje transpozycję tablicy metodą przestawiania elementów wewnątrz tablicy (bez tworzenia dodatkowej tablicy), tablica musi być kwadratowa, jeżeli nie spałnia tego warunku wartością funkcji jest null.

To pierwsze zadanie zrobiłem właśnie z użyciem dodatkowej tablicy, ale niestety nie mogę sobie poradzić z tym drugim bez używania tej tablicy dodatkowej. 

Wiem że powinno działać to mniej więcej na takiej zasadzie, że wiersze w tablicy zamieniają się miejscami z kolumnami, lecz nie bardzo przychodzi mi do głowy pomysł jak to zrobić. Napisałem takie coś:

public static int[][] transponujTablice2(int[][] t) {
        for (int i = 0; i < t.length; i++) {
            for (int j = 0; j < t[i].length; j++) {
                t[i][j] = t[j][i];
            }
        }
        return t;
    }

Jest to jedyna myśl jaka przychodzi mi do głowy. Wiem doskonale, że nie ma to prawa działać w takiej postaci, ale nie mam pomysłu jak to przerobić na coś sensownego i działającego.

Będę wdzięczny za wszelkie wskazówki i każdą pomoc. 

komentarz 28 listopada 2021 przez Oscar Pasjonat (22,170 p.)

Jeśli będziesz po prostu przypisywał, to za każdym razem tracisz/nadpisujesz jedną wartość, a każda stara wartość jest ci potrzebna. Zastosuj zamiane wartości:

t = a;

a = b;

b = t;

gdzie t - zmienna pomocnicza.

Czy to wystarczy - chyba nie bo muszisz każdą parę zamienić tylko raz, więc przetwórz tylko trójkątną połowę tablicy.

 

komentarz 28 listopada 2021 przez xTMx3 Obywatel (1,060 p.)

 

public static int[][] transponujTablice2(int[][] t) {
        int pomocnicza;
        for (int i = 1; i < t.length; i++) {
            for (int j = 1; j < t[i].length; j++) {
               if(i>=1 && j>=1) break;
               pomocnicza = t[i-1][j-1];
               t[i-1][j-1] = t[i][j];
               t[i][j] = pomocnicza;
            }
        }
        return t;
    }

Jeśli to jest rozwiązanie, o którym wspomniałeś to coś jest nie tak bo jak wprowadzam do tablicy jakieś wartości to po użyciu tej funkcji zamiast być przestawione są w ogóle nie ruszone. No chyba, że źle zrozumiałem twój pomysł, to wtedy byłbym wdzięczny za bardziej łopatologiczne wyjaśnienie, bo coś ciężko u mnie ostatnio z myśleniem. 

A, no i zmieniłem jeszcze trochę pętle, bo mi wypisywało błąd, że wyszedłem poza tablicę. 

komentarz 28 listopada 2021 przez Wiciorny Mędrzec (199,040 p.)

zaczynasz id i=1, oraz j=1 i przerywasz działanie  dla całej iteracji po kolumnach długości j.
kolega Ci w prosty sposób napisał zapisywanie aktualnego stanu przedstawiłem to w odp na pytanie. 
Generalnie mechanizm praktycznie jak podczas sortowania ;] przy którym często stan aktualny trzeba zapisać np podczas  bubble sorta  prostego
 

 if (arr[j] > arr[j+1])
                {
                    // swap arr[j+1] and arr[j]
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }


 

1 odpowiedź

+1 głos
odpowiedź 28 listopada 2021 przez Wiciorny Mędrzec (199,040 p.)
wybrane 28 listopada 2021 przez xTMx3
 
Najlepsza

Transpozycja jest dosyć prosta, generalnie tablica to typ referencyjny więc nie trzeba tworzyć nowej tylko można operować na przypisywaniu, bo kopiowana jest wartość referencji 

for (int i = 0; i < m; i++) {
    for (int j = i + 1; j < n; j++) {
        int temp = matrix[i][j];
        matrix[i][j] = matrix[j][i];
        matrix[j][i] = temp;
    }
}

temp- musisz po prostu aktualną wartość w danej pozycji zachować, następnie po wykonaniu transpozycji, na poprzednie miejsce przywrócić ten utracony po nadpisaniu 
Jest jeszcze druga opcja, jeśli masz gwarancje tego, że jest to kwadratowa tablica 2-wymiarowa 
 

int rows = matrix.length;
    int cols = matrix[0].length;

    for(int i=0;i<rows;i++){
        for(int j=i+1;j<cols;j++){
            matrix[i][j] = matrix[i][j] + matrix[j][i];
            matrix[j][i] = matrix[i][j] - matrix[j][i];
            matrix[i][j] = matrix[i][j] - matrix[j][i];
        }
    }

 

komentarz 28 listopada 2021 przez xTMx3 Obywatel (1,060 p.)
Dziękuję za rozwiązanie, jednak nie do końca rozumiem drugiego fora. Mógłbym prosić o wytłumaczenie czemu jest tam i+1?
1
komentarz 28 listopada 2021 przez Wiciorny Mędrzec (199,040 p.)
edycja 28 listopada 2021 przez Wiciorny
Nie chcemy powielać tych samych operacji skoro przechodzisz transpozycje dla każdego wiersza kolumne z góry do dołu to po co potem dla następnego wiersza przchodzić kolumny które już były modyfikowane

 

Istotna sprawa to taka, że przy transpozycji takiej macierzy nie potrzebujesz modyfikować diagnoalnej więc te indeksy pozostają na swoim miejscu

Podobne pytania

0 głosów
0 odpowiedzi 464 wizyt
pytanie zadane 20 marca 2020 w Java przez mn130496 Gaduła (3,510 p.)
0 głosów
1 odpowiedź 100 wizyt
pytanie zadane 18 maja 2019 w Java przez Paweł123 Nałogowiec (33,580 p.)
0 głosów
2 odpowiedzi 818 wizyt
pytanie zadane 1 kwietnia 2019 w Java przez Paweł123 Nałogowiec (33,580 p.)

86,540 zapytań

135,291 odpowiedzi

300,649 komentarzy

57,287 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...