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;
}
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
I tak nie chce śmigać.... nie grają mi warunki ;/
Jednak jest błąd, bo teraz nie sprawdza Ci ostatniego wiersza
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ć
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;
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)
śmiga. Dzięki :D
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;
}