Próbowałem porównać wartości każdego elementu w rzędzie macierzy 2D, aby upewnić się, że każdy element różni się od siebie.

Oto moja funkcja:

    private static boolean CompareComponentValue(int[][] m) {
    int k = 0;
    for (int i = 0; i < m.length; i = i + 1) {
        for (int j = 1; j < m[i].length; j = j + 1) {
            if (m[i][k] == m[i][j]) {
                return false;
            }
        }
        k = k + 1;
    }
    return true;
}

Pomyślałem, że muszę objąć każdy element w ten sposób: [0] [0] różni się od [0] [1], [0] [2] ... [0] [n], a następnie: [0] [1] różni się od [0] [2] ... [0] [n], a także dla każdego wiersza oczywiście [1] [0] różni się od [1] [1], [1] [2] ] ... [1] [n].

Nie mogę zmusić go do prawidłowego działania, ponieważ czasami zwraca fałsz, gdy nie powinien.

-1
nayorco3 20 listopad 2019, 00:00
Czyli Twoim celem jest sprawdzenie, czy każdy wiersz matrycy składa się z unikalnych elementów, zgadza się?
 – 
Fureeish
20 listopad 2019, 00:02
Cóż, sposób, w jaki to teraz napisałeś, czasami k będzie równać się j, a potem sprawdzasz, czy coś jest sobie równe...
 – 
azurefrog
20 listopad 2019, 00:03
Tak, nie wiem, czy to jest właściwy sposób, aby odpowiedzieć na Twój komentarz, ale to jest dokładnie to, czego potrzebuję
 – 
nayorco3
20 listopad 2019, 00:03
Powiedziałbym, że możesz mieć dodatkową złożoność przestrzeni, używając Hashmapy, aby sprawdzić, czy element z wiersza już istnieje na mapie. Każdy wiersz otrzymuje nową instancję mapy.
 – 
Kyle J
20 listopad 2019, 00:04
Jak już powiedziałem, nawet nie wiem, co to jest hashmap, ponieważ nadal jestem początkującym, wolałbym, aby był prosty
 – 
nayorco3
20 listopad 2019, 00:06

3 odpowiedzi

Prostym sposobem jest utworzenie Set z każdego wiersza i porównanie jego rozmiaru z rozmiarem wiersza. Set automatycznie odrzuca zduplikowane wartości, a zatem jeśli rozmiar Set jest równy rozmiarowi wiersza, wszystkie elementy w wierszu są unikatowe.

Demo:

import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class Solution {
    public static void main(String[] args) throws IOException {
        Integer n[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
        Integer x[][] = { { 1, 2, 2 }, { 4, 5, 6 }, { 7, 8, 9 } };
        System.out.println(compareComponentValue(n));
        System.out.println(compareComponentValue(x));
    }

    private static boolean compareComponentValue(Integer[][] m) {
        for (int i = 0; i < m.length; i++) {

            // Add the row i.e. m[i] to a Set
            Set<Integer> set = Arrays.stream(m[i]).collect(Collectors.toSet());

            // If there will be any duplicate values in m[i], they will be rejected by the
            // set and therefore the size of the set won't be equal to the size of m[i]
            if (set.size() != m[i].length)
                return false;
        }
        return true;
    }
}

Wynik:

true
false
0
Arvind Kumar Avinash 27 czerwiec 2021, 14:07

"... aby upewnić się, że każdy element różni się od siebie."

Potrzebujesz zestawu. Dodawanie elementu do zestawu i testowanie, czy element jest już w zestawie, jest łatwe do wykonania za pomocą operacji add i contains. Ponadto obie te operacje zajmują czas O(1), więc rozwiązanie będzie wydajne; nie trzeba ciągle przeszukiwać matrycy.

Użyj również „ulepszonej pętli for”, jeśli potrzebujesz tylko wartości, a nie indeksów.

import java.util.*;

public class CheckMatrix {
    public static boolean hasDuplicate(int[][] matrix) {
        Set<Integer> seen = new HashSet<>();

        for(int[] row : matrix) {
            // empty the set, to only check for duplicates within a single row
            seen.clear();

            for(int x : row) {
                if(seen.contains(x)) { return true; }
                seen.add(x);
            }
        }

        return false;
    }
}

Jeśli chcesz być fantazyjny, możesz wykorzystać fakt, że metoda add zwraca boolean wskazujący, czy x nie był już obecny: zamień treść wewnętrznej pętli na:

                if(!seen.add(x)) { return true; }
0
kaya3 20 listopad 2019, 00:39

Przede wszystkim dziękuję wam za odpowiedzi, ale naprawdę przekroczyły mój poziom, jak powiedziałem na początku, na razie nie używam żadnych pakietów, ponieważ nadal jestem beeginerem i chcę pozostać przy podstawowej logice i w końcu otrzymałem odpowiedź, intensywnie się zastanawiając.

    private static boolean NumerosDistintosFila(int[][] m) {
    for (int i = 0; i < m.length; i = i + 1) {
        for (int k = 0; k < m.length - 2; k = k + 1) {
            for (int j = 1 + k; j < m[i].length; j = j + 1) {
                if (m[i][k] == m[i][j]) {
                    return false;
                }
            }
        }
    }
    return true;
}

Dodałem kolejną pętlę for ze zmienną k, która, jak zauważyłem, nigdy nie przekraczała długości matrycy - 2, na przykład, gdybym miał użyć 5x5, potrzebowałbym go do 3. To dlatego, że ostatni element, który muszę porównać w pierwszym wierszu, na przykład to [0] [3] do [0] [4].

Moja logika była taka, że musiałem porównać elementy bez powtarzania porównań między nimi, więc ten kod zasadniczo porównuje pierwszy element z każdym elementem w tym samym wierszu, a następnie porównuje drugi element z każdym elementem oprócz pierwszego, a następnie trzeciego elementu z czwartym i piątym itd.

Jeszcze raz dziękuję wam za rozwiązania. Wypróbowałem je i wszystkie działały idealnie, ale jak powiedziałem, na razie chcę pozostać przy podstawowej logice.

0
nayorco3 20 listopad 2019, 01:34