x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dynamicke pole - Java - Fórum - Programujte.comDynamicke pole - Java - Fórum - Programujte.com

 

24. 11. 2010   #1

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 :-)

---  
Nahlásit jako SPAM
IP: 147.32.31.–
Reklama
24. 11. 2010   #2

Najskor si mozes deklarovat pole: int [][] pole; Potom nacitas tie vstupy, zistis si najdlhsi riadok a ulozis do premennej napr: int x; Potom mozes vytvorit 2D pole : pole = new int [x][3];

---  
Nahlásit jako SPAM
IP: 158.193.98.–
25. 11. 2010   #3

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 ;-)

---  
Nahlásit jako SPAM
IP: 147.32.31.–
25. 11. 2010   #4

ano presne, vznikne stvorcove pole doplnene o nuly. neviem o tom ze by sa dalo deklarovat pole s roznou dlzkou stlpcov, myslim si ze sa to ani neda.

---  
Nahlásit jako SPAM
IP: 158.193.98.–
25. 11. 2010   #5

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();
}
}

---  
Nahlásit jako SPAM
IP: 86.61.140.–
25. 11. 2010   #6

Tak vidim ze mam este velke rezervy... gj kverulant :smile1:

---  
Nahlásit jako SPAM
IP: 158.193.98.–
25. 11. 2010   #7

prima dik, tohle jsem potreboval :-)

---  
Nahlásit jako SPAM
IP: 147.32.31.–
27. 11. 2010   #8

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();
}

---  
Nahlásit jako SPAM
IP: 213.235.145.–
28. 11. 2010   #9

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.

---  
Nahlásit jako SPAM
IP: 86.61.140.–
28. 11. 2010   #10

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[ ][ ]

---  
Nahlásit jako SPAM
IP: 92.62.224.–
29. 11. 2010   #11

Dík za pomoc, nakonec teda hodnoty zaznamenávám do Stringu oddělené mezerou a ty po rozsekání převádím na inty. To s kopírováním do dalšího pole jsem nerozchodil.

---  
Nahlásit jako SPAM
IP: 89.190.90.–
KIIV
Hero
29. 11. 2010   #12

to uz sis mohl udelat klidne objekt s polem a pak pole objektu

ale pokud to nepotrebujes mit nejak rychle tak je to jedno

---  
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
2. 12. 2010   #13

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?

---  
Nahlásit jako SPAM
IP: 147.32.31.–
D-Fox
Stálý člen
2. 12. 2010   #14

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.

---  
Nahlásit jako SPAM
IP: 89.176.8.–
Zjistit počet nových příspěvků

Nápověda: Označení konkrétního příspěvku jako řešení

Najeď na příspěvek, který obsahuje řešení, rozbal nabídku možnosti (dle obrázku) a klikni na Označit jako řešení.

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

Vložení zdrojového kódu

Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek na disku:

Vložení videa

Vlož URL adresu videa:
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
x
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj toto vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními (pošleme ti mejl).
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé: 0 registrovaných, 13 hostů

Podobná vlákna

Vlákno
Diskuze

Dynamicke pole - založil Earl Cash

Ne/dynamicke pole - založil cecilconrad

Dynamicke pole na string - založil mustafa

Moderátoři diskuze

 

Hostujeme u Českého hostingu  |  ∆ Nahoru  |  ISSN 1801-1586 Webtea.cz logo © 20032013 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý