Czyszczenie i walidacja danych 2D
Oczyszczą Państwo i zweryfikują dane całkowite 2D: zabezpieczą się przed wierszami null, sprawdzą indeksy względem zakresów, ograniczą wartości spoza zakresu, ujednolicą kształty tablic postrzępionych oraz wygenerują raporty walidacji.
Czyszczenie i walidacja danych 2D to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 6 z 6. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 6 lekcji w sumie.
Po co porządkować dane 2D
Cel: Zapewnić bezpieczeństwo i spójność danych całkowitych 2D. Należy: (1) obsługiwać wiersze null, (2) sprawdzać zakresy osobno dla każdego wiersza, (3) ograniczać wartości do prawidłowego zakresu, (4) w razie potrzeby normalizować nieregularne kształty oraz (5) tworzyć raport walidacji.
Wartości null i zakresy
Krok 1: Zastąpić wiersze null pustymi tablicami i defensywnie kopiować wartości. Należy udostępnić pomocniczą metodę inBounds, która będzie sprawdzać zakresy osobno dla poszczególnych wierszy.
public class Main {
// Make a defensive copy of m. Replace null rows with empty arrays.
static int[][] copyOrEmpty(int[][] m) {
if (m == null) return new int[0][0];
int[][] out = new int[m.length][];
for (int r = 0; r < m.length; r = r + 1) {
if (m[r] == null) {
out[r] = new int[0];
} else {
out[r] = new int[m[r].length];
for (int c = 0; c < m[r].length; c = c + 1) out[r][c] = m[r][c];
}
}
return out;
}
// Safe bounds check for jagged matrices
static boolean inBounds(int[][] m, int r, int c) {
return m != null && r >= 0 && r < m.length && m[r] != null && c >= 0 && c < m[r].length;
}
public static void main(String[] args) {
int[][] raw = new int[][] { null, {1, 2, 3}, {4} };
int[][] cleaned = copyOrEmpty(raw);
System.out.println("rows = " + cleaned.length);
for (int r = 0; r < cleaned.length; r = r + 1) System.out.println("row " + r + " len = " + cleaned[r].length);
System.out.println("inBounds(1,2) = " + inBounds(cleaned, 1, 2)); // true
System.out.println("inBounds(2,2) = " + inBounds(cleaned, 2, 2)); // false
}
}
Ograniczanie wartości
Krok 2: Ograniczyć wartości do prawidłowego zakresu, na przykład 0–100. Nieprawidłowe wartości ujemne stają się równe 0, a wartości zbyt duże — 100.
public class Main {
static int clamp(int v, int lo, int hi) { if (v < lo) return lo; if (v > hi) return hi; return v; }
static void clampAll(int[][] m, int lo, int hi) {
if (m == null) return;
for (int r = 0; r < m.length; r = r + 1) {
if (m[r] == null) continue;
for (int c = 0; c < m[r].length; c = c + 1) m[r][c] = clamp(m[r][c], lo, hi);
}
}
static void print(int[][] m) {
for (int r = 0; r < m.length; r = r + 1) {
if (m[r] == null) { System.out.println("<null row>"); continue; }
for (int c = 0; c < m[r].length; c = c + 1) System.out.print(m[r][c] + (c + 1 < m[r].length ? " " : ""));
System.out.println();
}
}
public static void main(String[] args) {
int[][] m = { { -5, 101, 50 }, null, { 200 } };
System.out.println("before clamp:");
print(m);
clampAll(m, 0, 100);
System.out.println("after clamp [0..100]:");
print(m);
}
}
Normalizacja kształtu
Krok 3: Znormalizować dane do kształtu prostokątnego, uzupełniając każdy krótki lub pusty wiersz do długości najdłuższego wiersza za pomocą wartości wypełnienia, na przykład 0.
public class Main {
static int[][] padToMaxCols(int[][] m, int pad) {
if (m == null) return new int[0][0];
int rows = m.length;
int maxCols = 0;
for (int r = 0; r < rows; r = r + 1) if (m[r] != null && m[r].length > maxCols) maxCols = m[r].length;
int[][] out = new int[rows][maxCols];
for (int r = 0; r < rows; r = r + 1) {
int cols = (m[r] == null) ? 0 : m[r].length;
for (int c = 0; c < cols; c = c + 1) out[r][c] = m[r][c];
for (int c = cols; c < maxCols; c = c + 1) out[r][c] = pad; // pad missing cells
}
return out;
}
static void print(int[][] x) {
for (int r = 0; r < x.length; r = r + 1) {
for (int c = 0; c < x[r].length; c = c + 1) System.out.print(x[r][c] + (c + 1 < x[r].length ? " " : ""));
System.out.println();
}
}
public static void main(String[] args) {
int[][] jag = { {1, 23, 456}, {7, 8}, null, {90} };
int[][] rect = padToMaxCols(jag, 0);
print(rect);
}
}
Raport walidacji
Krok 4: Utworzyć raport walidacji: zliczyć wartości ujemne, wartości zbyt duże, wiersze null oraz łączną liczbę odwiedzonych komórek.
public class Main {
static class Report { int negatives; int overMax; int nullRows; int cells; }
static Report validate(int[][] m, int hi) {
Report r = new Report();
if (m == null) return r;
for (int i = 0; i < m.length; i = i + 1) {
if (m[i] == null) { r.nullRows = r.nullRows + 1; continue; }
for (int j = 0; j < m[i].length; j = j + 1) {
int v = m[i][j];
r.cells = r.cells + 1;
if (v < 0) r.negatives = r.negatives + 1;
if (v > hi) r.overMax = r.overMax + 1;
}
}
return r;
}
public static void main(String[] args) {
int[][] m = { { -5, 101, 50 }, null, { 200 } };
Report r = validate(m, 100);
System.out.println("cells=" + r.cells + ", negatives=" + r.negatives + ", overMax=" + r.overMax + ", nullRows=" + r.nullRows);
}
}
Wyświetlanie z pomijaniem wartości null
Krok 5: Udostępnić wyrównane wyświetlanie, które poprawnie pomija wiersze null i uwzględnia długość każdego wiersza.
public class Main {
static boolean inBounds(int[][] m, int r, int c) {
return m != null && r >= 0 && r < m.length && m[r] != null && c >= 0 && c < m[r].length;
}
static int[] widths(int[][] m) {
int maxCols = 0; if (m == null) return new int[0];
for (int r = 0; r < m.length; r = r + 1) if (m[r] != null && m[r].length > maxCols) maxCols = m[r].length;
int[] w = new int[maxCols];
for (int r = 0; r < m.length; r = r + 1) {
if (m[r] == null) continue;
for (int c = 0; c < m[r].length; c = c + 1) {
int len = Integer.toString(m[r][c]).length();
if (len > w[c]) w[c] = len;
}
}
for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
return w;
}
static void printAlignedSkipNull(int[][] m) {
int[] w = widths(m);
for (int r = 0; r < m.length; r = r + 1) {
if (m[r] == null) { System.out.println("<skipped null row>"); continue; }
String line = "";
for (int c = 0; c < m[r].length; c = c + 1) {
String s = Integer.toString(m[r][c]);
while (s.length() < w[c]) s = " " + s;
line = line + s + (c + 1 < m[r].length ? " " : "");
}
System.out.println(line);
}
}
public static void main(String[] args) {
int[][] m = { { 1, 200, -3 }, null, { 45 } };
printAlignedSkipNull(m);
}
}
Sprawdzenie bezpiecznego dostępu
Szybkie sprawdzenie: Jak bezpiecznie uzyskać dostęp do m[r][c] w danych, które mogą być nieregularne?
Podsumowanie i następny krok
Podsumowanie: Defensywnie kopiowano dane, sprawdzano indeksy, ograniczano wartości, normalizowano nieregularne kształty i tworzono podsumowania walidacji. Te podstawowe elementy sprawiają, że kolejne algorytmy 2D są odporne na błędy.
Często zadawane pytania
Czy lekcja „Czyszczenie i walidacja danych 2D” jest bezpłatna?
Tak — pełny tekst „Czyszczenie i walidacja danych 2D” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 6 lekcji w sumie.
Co nauczysz się w „Czyszczenie i walidacja danych 2D”?
Oczyszczą Państwo i zweryfikują dane całkowite 2D: zabezpieczą się przed wierszami null, sprawdzą indeksy względem zakresów, ograniczą wartości spoza zakresu, ujednolicą kształty tablic postrzępionyc… Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 6 z 6.
Ile czasu zajmuje lekcja „Czyszczenie i walidacja danych 2D”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy tablic 2D i zagnieżdżona iteracja
- Tablice postrzępione i formatowanie tabel
- Maksima wierszy i kolumn, transpozycja i formatowanie
- Projekt 2D: dziennik ocen
- Narzędzia 2D jako klasa pomocnicza (refaktoryzacja)
- Czyszczenie i walidacja danych 2D