ahoj,
potreboval bych pomoct, mam vytvorit dvourozmerne pole s tim, ze predem zadam pocet radku a pak rucne z klavesnice zadavam jednotlive hodnoty a kazdy radek ukoncim zadanim nuly.
PR:
Zadam:
1
2
4
0
80
0
5
10
0
Ma vzniknout pole:
1 2 4
80
5 10
Nevim tedy predem jak dlouhe radky budou nemluve o tom ze bude kazdy jinak dlouhy. Jsem zacatecnik a umim vytvorit jen pole s predem danym poctem radku i sloupcu a s timhle jsem se jeste nesetkal tak beru kazdou radu :-)
Fórum › Java
Dynamicke pole
jo to by snad slo akorat ze v tom pripade by mi asi vzniklo ctvercovy pole doplneny nulama co? jakoze radky ktery nezadam stejne dlouhy jako ten nejdelsi budou do velikosti toho nejdelsiho doplneny o nuly. ale jestli to jinak nejde tak to tak udelam kazdopadne dik ;-)
V javě (ale i třeba v C/C++) se to právě udělat dá.
public static void main(String[] args) {
int[][] a = new int[3][];
for(int i = 0; i < a.length; i ++) {
a[i] = new int[i + 1];
for(int j = 0; j < a[i].length; j ++) {
a[i][j] = j;
}
}
for(int i = 0; i < a.length; i ++) {
for(int j = 0; j < a[i].length; j ++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
prima dik, tohle jsem potreboval :-)
Ahoj můžu se zeptat jak se ti povedlo udělat rozšiřující pole tak, aby se ti při a[i] = new int[i + 1]; nevymazaly předešlé hodnoty? Napadlo mě je ukládat do dalšího pole a prvek přidávat do něj, ale vznikl stejný problém, to pole musím rozšiřovat a vymaže se mi.
Došel jsem zatím k tomuto:
Scanner sc = new Scanner(System.in);
int radky = sc.nextInt();
int[][] a = new int[radky][];
for (int i = 0; i < radky; i++) {
int cislo = -1;
int d = 0;
System.out.println("zadej prvky");
while (cislo != 0) {
a[i] = new int[d + 1];
cislo = sc.nextInt();
a[i][d] = cislo;
System.out.println(a[i][d]);
d++;
}
}
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
Použij http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#arraycopy(java.lang.Object, int, java.lang.Object, int, int). Kvůli zrychlení je lepší zvětšovat pole třeba na dvojnásobek nebo použít ArrayList nebo LinkedList.
no ja sem to udelal tak ze jsem si dilci radek napred nacetl do jednoducheho pole a pak jsem kdyz tam byl cely jsem si zjistil jeho delku a az po tom jsem vytvoril novy radek v tom dvourozmernym poli a nakopiroval ho tam postupne cely najednou. takze v tom tvym programu bych v tom prvnim cyklu nacital hodnoty do jednorozmerneho pole a az kdyz by ten cyklus skoncil tak bych vytvoril novy radek o delce d ktere se ti celou dobu pricita a pak cyklem hodnoty z jednoducheho pole napr. b[ ] nakopiroval do daneho radku pole a[ ][ ]
no objekty jsme jeste nedelali takze jediny co o nich zatim vim je ze neco takovyho existuje :-) spis by me zajimalo jak se da rozdelit ten string na jednotlivy hodnoty int?
Urcite by bylo nejjednoduzsi pouzit kolekce, ale kdyz jsi moc jeste objekty nedelal, tak tady mas nejakej zaklad, moc sem to nekontroloval, takze tam mozna bude chtit osetrit nejaky vstupy (null hodnoty/pole s nulovou delkou atd..), ale tak pro inspiraci ti to snad postaci:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Example {
public static final String SCAN_REPEAT = "Spatny format, opakuj zadani:";
public static final int EOL = 0;
public static final Scanner scanner;
static {
scanner = new Scanner(System.in);
}
public static void main(String[] args) {
int radky = 0;
int[][] pole;
radky = nactiInt("Zadej pocet radku: ");
pole = new int [radky][];
int numero = 0;
int position = 0;
for (int i = 0; i < pole.length; i++) {
System.out.println("Radek:" +i);
pole[i] = new int[4];
position = 0;
do {
numero = nactiInt("Zadejte cislo: ");
pole[i][position++] = numero;
if (numero != EOL && (position+1) > pole[i].length)
pole[i] = realokuj(pole[i]);
} while (numero != EOL);
}
if (radky != 0) {
int[] bezNul = shring(pole[0]); //pokud by by si chtel odstranit nuly na konci...
}
}
public static int[] realokuj(int[] pole) {
System.out.println("INFO: zvetsuji velikost pole z " +pole.length +" na " +(pole.length*2));
int[] temp = pole;
pole = new int[pole.length * 2];
System.arraycopy(temp, 0, pole, 0, temp.length);
return pole;
}
public static int[] shring(int[] pole) {
int index = indexOf(pole, EOL);
if (index == -1)
return pole;
int[] temp = pole;
pole = new int[index];
System.arraycopy(temp, 0, pole, 0, index);
return pole;
}
public static int indexOf(int[] array, int value) {
for (int i = 0; i < array.length; i++) {
if (array[i] == value)
return i;
}
return -1;
}
public static int nactiInt(String text) {
System.out.println(text);
while (true) {
try {
return scanner.nextInt();
} catch (InputMismatchException e) {
System.out.println(SCAN_REPEAT);
scanner.nextLine();
}
}
}
}
Jinak na rozdeleni stringu muzes pouzit StringTokenizer.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Dynamicke pole — založil Earl Cash
Ne/dynamicke pole — založil cecilconrad
Dynamické jednorozměrné pole — založil Epoxi
Dynamické pole reťazcov — založil gaben
Dynamicke 2rozmerne pole — založil light_c_programator
Moderátoři diskuze