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.
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
"... 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; }
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.
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
k
będzie równać sięj
, a potem sprawdzasz, czy coś jest sobie równe...