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

Transpozycja tablicy.

VPS Starter Arubacloud
0 głosów
399 wizyt
pytanie zadane 28 listopada 2021 w Java przez xTMx3 Obywatel (1,560 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 Nałogowiec (29,290 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,560 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 Ekspert (269,120 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 Ekspert (269,120 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,560 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 Ekspert (269,120 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
2 odpowiedzi 272 wizyt
pytanie zadane 15 lipca 2022 w Java przez Ada3141592654 Początkujący (270 p.)
0 głosów
0 odpowiedzi 1,048 wizyt
pytanie zadane 20 marca 2020 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 18 maja 2019 w Java przez Paweł123 Nałogowiec (33,500 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...