przepisanie tablicy problem

0

Witam, mój problem, jak przypuszczam jest banalny, ale ja przez 2 dni nie mogłem znaleźć błędu :/ Będę bardzo wdzięczny, jak ktoś rzuci okiem.Chodzi mi o to, że chcę skopiować do tablicy weight[] "połowę czyli prawy górny narożnik" macierzy wygenerowanej za pomocą f. generuj macierz. F generuj macierz jest bardzo długa, a wiem, że działa poprawnie, więc nie będę jej zamieszczał. wywołanie jej tworzy i zapisuje do topology[][] np taką macierz:

0 1 2 3
9 0 4 5
9 9 0 6
9 9 9 0

Teraz chciał bym wczytać do tablicy weight[] prawy górny narożnik topology[][], czyli odpowiednio: [1 2 3 4 5 6] chciał bym mieć w topology. Niestety kiedy wykonuje funkcję copy, w tablicy weight[] są same "6" (czyli topology[2][3])

Będę bardzo wdzięczny, jak ktoś rzuci okiem na kod, bo ja po prostu nie mogę znaleźć błędu w funkcji copy (podejrzewam, że tam jest błąd) a termin oddania programu tuż tuż

class Krawedz{
    int w1;
    int w2;
    int koszt;
    

    public void Nadaj_wartosci(int nr_w1, int nr_w2, int k) {
        w1 = nr_w1; w2 = nr_w2; koszt=k;
    }

    public String Podaj_wartosci() {
       String S ="w1: "+w1+"   w2: "+w2+"   koszt: "+koszt;
        return S;
    }
}
class minTree{
    int size,licznik;
    Krawedz weight[]=null;
    Krawedz Dana=null;

    public void utworz_weight(){
            weight = new Krawedz[size*size];
    }

    public void copy(int tab[][]){
 
       Dana=new Krawedz();
        int i=0; int j;  licznik=0;
        for(j=1;1==1; j++){
            Dana.Nadaj_wartosci(i, j, tab[i][j]);
            weight[licznik]=Dana;
            System.out.println(weight[licznik].Podaj_wartosci());
            licznik++;
            if(j==size-1){  i++; j=i; }
            if((j==size-1)&&(i==size-1)) {  break;  }
        }
     }

}

public class Kruskal_Main {

    public static void main(String[] args) {
       int il_wez=4

        Macierz mac = new Macierz();
        mac.generuj_macierz(il_wez);
      
        minTree MST=new minTree();
        MST.size=il_wez;
        MST.utworz_weight();
        MST.copy(mac.topology);
                    
        }
        }

Będę bardzo wdzięczny za pomoc

0

Poniższy kod demonstruje jak skopiować górną część macierzy kwadratowej.

import java.util.Arrays;

public class Program {
	
	public static void main(String args[]) { 
		int[][] source = new int[][]
		{
				{0, 1, 2, 3},
				{9, 0, 4, 5},
				{9, 9, 0, 6},
				{9, 9, 9, 0}
		};
		
		System.out.println(Arrays.toString(copy(source)));
	}
	
	private static int[] copy(int[][] source) {
		if (source == null || source.length == 0 || source.length != source[0].length)
			throw new IllegalArgumentException("source");
		int[] result = new int[(source.length * source.length - source.length) / 2];
		int i = 0, j = 0, z = 0;
		for (i = 0; i < source[0].length; i++)
			for (j = i + 1; j < source.length; j++) {
				result[z++] = source[i][j];
			}
		return result;
	}
}
0

Twój problem to to, że:

Dana=new Krawedz();

tu tworzysz nowy obiekt typu "Dana", a następnie w pętli:

Dana.Nadaj_wartosci(i, j, tab[i][j]);

Nadajesz ileś tam razy w zależności od wielkości macierzy temu "samemu obiektowi" różne wartości pól. Ale to jest cały czas ten sam obiekt. No i później wstawiasz do tablicy:

weight[licznik]=Dana;

"ten sam" obiekt ileś razy. Zauważ na swoim przykładzie, że ostatnim elementem który ma być wstawiony jest 6. Czyli 6 jest wstawiane do obiektu który jest "n" razy w tablicy.

Mam nadzieję, że zrozumiałeś co starałem się przekazać. :) Rozwiązaniem twojego problemu jest np. przeniesienie ustawiania pól do konstruktora i później wywoływanie go tak:

weight[licznik]=new Krawedz(i, j, tab[i][j]);

Pozdrawiam

0

No zrozumiałem, zrozumiałem :) Dzięki.

czyli taki konstruktor w klasie krawedz?

Krawedz(int nr_w1, int nr_w2, int k) {  //NADAJ WRTOSCI (KONSTRUKTOR)
        w1 = nr_w1; w2 = nr_w2; koszt=k;
    }

czyli w zasadzie f nadaj wartosc prezrobilem na konstruktor

No ale wyskakuje mi jakieś smieci z kolei teraz:
Klada MinTree wygląda:

class minTree{
    int size,licznik;
    public Krawedz weight[]=null;
    
    public void utworz_weight(){
         weight = new Krawedz[size*size];

    }
     

    public void copy(int tab[][]){
   

        int i=0; int j;  licznik=0;
        for(j=1;1==1; j++){
            weight[licznik] = new Krawedz(i, j, tab[i][j]);
       
  
            licznik++;
            if(j==size-1){  i++; j=i;  }
            if((j==size-1)&&(i==size-1)) {   break;  }
        }
      
      
    }

}
0

Twoim warunkiem w pętli jest 1 == 1 co daje zawsze true i pętla nigdy się nie kończy. Poniżej masz dwie instrukcje if o identycznym warunku j==size-1.
Żeby tego typu wpadek nie było staraj się unikać w warunkach pętli testowania równości lub nierówności jeżeli da się go zamienić na porównanie za pomocą znaków mniejszości/większości.
Jeszcze raz sprawdź sobie co chciałeś napisać.

0

A co ci wyskakuje?

@up Ma w pętli "break" więc pętla się kończy :) To raczej nie najlepsze rozwiązanie ale jest :p

0
public class Kruskal_Main 
{

	public static void main(String[] args) 
	{
		int il_wez=4;

		Macierz mac = new Macierz();
		mac.generuj_macierz(il_wez);
     
		minTree MST = new minTree();
		MST.ustawRozmiar(il_wez);
		MST.copy(mac.pobierzMacierz()); 
		// metoda wyswietlajaca tablice dla sprawdzenia
		MST.wyswietlTablice();
	}
}

// zrobilem sobie przykladowa klase
public class Macierz {

	public int[][] topology;

	public void generuj_macierz(int ilWez) {
		topology = new int[][]
		                     {
								{0, 1, 2, 3},
								{9, 0, 4, 5},
								{9, 9, 0, 6},
								{9, 9, 9, 0}
		                     };
	}
	
	public int[][] pobierzMacierz()
	{
		return topology;	
	}
}

class minTree{
    int size,licznik;
    Krawedz weight[]=null;
    Krawedz Dana=null;

    public void ustawRozmiar(int rozmiar)
    {
    	size = rozmiar;
    	// ustawianie dlugosci tablicy przeniesione tutaj nie ma sensu dodatkowa metoda. Wzor zmieniony bo nie potrzeba co "size*size" elementow
    	weight = new Krawedz[(size*size - size)/2];
    }

    // metode zostawilem w spokoju :) jak zechcesz to sobie zmienisz ten warunek petli jak nie to nie w kazdym razie dziala
    public void copy(int tab[][]){
 
    	int i=0;
    	int j;
    	
    	licznik=0;
    	for(j=1;1==1; j++){
    		// za kazdym razem tworzymy nowy obiekt
    		weight[licznik] = new Krawedz(i, j, tab[i][j]);
    		
    		//System.out.println(weight[licznik].Podaj_wartosci());
    		licznik++;
    		if(j==size-1){  i++; j=i; }
    		if((j==size-1)&&(i==size-1)) {  break;  }
    	}
    }

    // wyswietla tablice zeby sprawdzic czy wszystko ok
    public void wyswietlTablice()
    {
    	for(int i = 0; i < weight.length; i++)
    	{
    		System.out.println(weight[i].Podaj_wartosci());
    	}
    }
}

class Krawedz{
    int w1;
    int w2;
    int koszt;
 
    public Krawedz(int nr_w1, int nr_w2, int k)	{
    	w1 = nr_w1;
    	w2 = nr_w2;
    	koszt=k;
    }

    public String Podaj_wartosci() {
       String S ="w1: "+w1+"   w2: "+w2+"   koszt: "+koszt;
       return S;
    }
}

Tak napisałem i mi wszystko działa. Sprawdziłem. Jeszcze jedno. Nie odwołuj się do pól klas bezpośrednio tylko pisz dla nich metody zwracające wartości.

Pozdro

0

a owszem, działa. Jestem bardzo wdzięczny

0

a jeszcze czemu nie mogę wyświetlić w main zawartości tab w ten sposób:

System.out.print(MST.weight[0].koszt);

wyskakuje nullPointerEcception

tak samo nie mogę się do tego odwoałać:

MST.weight[1].koszt = 1;

tzn wiem, że powinienem stworzyć funkcję która to wyświetli, zmieni, ale według mnie w ten sposób też powinno działać

0

Pewnie odwołujesz się do tego do tego jak jeszcze tablica nie została utworzona "weight[]=null;" dopiero jak utworzysz ją w konstruktorze i powrzucasz jakieś wartości to możesz się do nich odwołać. Ale to strzał bo linijki wyrwane z kontekstu :) Nie masz w kodzie modyfikatora dostępu przed polami. Zapomniałem dopisać :p Czyli domyślnie public czyli możesz się w ten sposób odwołać. Co nie zmienia faktu, że tak jak mówiłem niepowinieneś. Przed każdym polem w klasie powinno stać private.

Pozdrawiam

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