Czy macierz jest różnowartościowa?

0
Tak jak w nagłówku, macierz ma być różnowartościowa.


public boolean czyRoznowartosciowa() {
	boolean roznowartosciowa = true;
	
	for(int i = 0; i < macierz.length; i++) {
		for(int j = 0; j < macierz[i].length; j++) {
			for(int k = i+1; k < macierz.length; k++) {
 //  Raz jak dam k = i,  a w drugim przypadku jak dam k = i +1 to tam gdzie wcześniej nie działało później działa....

				for(int h = j+1; h < macierz[k].length; h++)
				{
					if(macierz[i][j]==macierz[k][h]) {
						roznowartosciowa = false;
					}
				}
				
			}
		}
	}
	
	
		
	return roznowartosciowa;
}
1

Widzę ostro działasz. Warunki wydają się być dobrze, ale skoro wykryje, że są w niej takie same wartości to od razu przerywaj pętle i zwracaj wynik bo po co marnować procka

                    if(macierz[i][j]==macierz[k][h]) {
                        return false;
                    }

a na końcu zrób return true;
i możesz pozbyć się tej zmiennej roznowartosciowa

0

I tak nie chce śmigać.... nie grają mi warunki ;/

0

Jednak jest błąd, bo teraz nie sprawdza Ci ostatniego wiersza

0

Dobra mam robisz k = 0 i h = 0 a w pętli h piszesz

                            if (i >= k && j >= h)
                            {
                                continue;
                            }
                            if (tablica[i, j] == tablica[k, h])
                            {
                                return false;
                            }

Teraz powinno działać

0

public boolean czyRoznowartosciowa() {

for(int i = 0; i < macierz.length; i++) {
	for(int j = 0; j < macierz[i].length; j++) {
		
		for(int k = 0; k <= (macierz.length-1); k++) {
			for(int h = 0; h < (macierz[k].length-1); h++)
			{if (i >= k && j >= h)
            {
                continue;
            }
            if (macierz[i][j] == macierz[k][h])
            {
                return false;
            }
			}
			
		}
		/*for(int k = i-1; k>=0; k--) {
			for(int h = j-1; j>=0; h--) {
				if(macierz[i][j]==macierz[k][h]) {
					return false;
				}
			}
		}*/
	}
}

Wypisuje true przy poniższym układzie.... rozkminiam na tysiąc 500 sposobów i lipa

Macierz macierz1 = new Macierz(3,3);
macierz1.macierz[0][0] = 2;
macierz1.macierz[0][1] = 7;
macierz1.macierz[0][2] = 4;
macierz1.macierz[1][0] = 12;
macierz1.macierz[1][1] = 234;
macierz1.macierz[1][2] = 2;
macierz1.macierz[2][0] = 32;
macierz1.macierz[2][1] = 143;
macierz1.macierz[2][2] = 23;

1

Po pierwsze popraw ten warunek bo troszkę źle go zapisałem bo niepotrzebnie wykonywał dodatkowe operacje, ma być tak
(((i >= k && j >= h) || (i > k && j < h)))

Po drugie w Twoim kodzie jest błąd ma być:

h <= (macierz[k].length-1)

0

śmiga. Dzięki :D

1

można też bardziej elegancko:

public boolean czyRoznowartosciowa
{
    Set<Integer> set = new HashSet<Integer>();
    for(int number: macierz)
    {
        set.add(number);
    }
    return set.size() == macierz.length;
}

Szybsza wersja (sporo szybsza, jeżeli powtarzające się elementy są na początku tablicy):

public boolean czyRoznowartosciowa
{
    Set<Integer> set = new HashSet<Integer>();
    for(int number: macierz)
    {
        if(!set.add(number))
        {
             return false;
        }
    }
    return true;
}

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