Diskuze: Tabulka
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.


Matěj Kripner:13.10.2014 18:55
Samozřejmě existuje celá řada kolekcí. Pro tebe ale asi bude vhodné pole polí. To znamená založení:
int[][] = new int[10][10];
a ukládání(ulozis hodnotu 23 na zouradnice x a y):
int[x][y] = 23;
+20 Zkušeností
+2,50 Kč

Tomhaus:13.10.2014 20:38
a kdybych chtěl pak vykreslit tu hodnotu (resp. číslo jako string) v paintu a dát mu pozici úzce související s pozicí v tabulce, tak tu x-ovou a y-ovou souřadnici (pro všechny možnosti) můžu převést jak? Nechce se mi psát tolikrát
if(x = 1 && y = 1){
xCoor = 3;
yCoor = 3;
}
if(x = 2 && y = 1){
xCoor = 43;
yCoor = 3;
}
atd...
Matěj Kripner:13.10.2014 21:04
Na tvém místě bych si vytvořil další pole polí a v něm hodnoty pozic pro daný index. Jako hodnotu bych zvolil něco jako třídu Point, která reprezentuje hodnotu x a y. Např. na indexech 1, 1 by byla hodnota new Point(3, 3) a na indexech 2, 1 hodnota new Point(43, 3).
A ještě bych chtěl vědět, když mam posuvný rámeček(posouvá se po vykreslené tabulce), který jako ukazuje, kam se to číslo zadává v tabulce, takže já potřebuju zjistit aktuální polohu toho rámečku, ale nemůžu ji udělat relativní, protože se mi to číslo přemisťuje i s tím rámečkem, když posunu ten rámeček.
g.drawString("1", border.getxCoor(), border.getyCoor());
Pro vysvětlení dám obrázky:
Tomhaus:13.10.2014 21:26
a jakým for loopem to mam nechat přiřadit? nebo to mam snad přiřazovat ručně?
Matěj Kripner:14.10.2014 6:57
To co jsem psal v posledním příspěvku by asi nebyl nejlepší postup. Zkus vytvořit nějaký objekt s atributy x, y, a hodnota a ten použij jako typ pole polí. Pokud chceš k tomu rámečku později přistupovat, ukládej si jeho souřadnice.
Tomhaus:14.10.2014 20:06
jo, ale jak můžu přiřadit tři data do jednoho objektu?
Matěj Kripner:14.10.2014 21:41
Uložíš ty tři data jako atributy toho objektu a přiřadíš k nim gettery. Myslím, že je to návrhový vzor kontejner nebo tak něco.
Tomhaus:16.10.2014 19:50
To mam vytvořit novou třídu nebo to není potřeba?
Matěj Kripner:16.10.2014 20:48
Musíš vytvořit novou třídu, když chceš specifikovat její atributy a
následně ji použít jako typ pole
Tomhaus:19.10.2014 21:59
a jak mam přiřadit každýmu prvku pole polí ten atribut, když musim tomu atributu ještě nastavit ty hodnoty?
Matěj Kripner:20.10.2014 18:14
Asi jsi mě nepochopil. Do pole ukládáš objekty a tyto objekty mají data uložená ve svých atributech.
Tomhaus:20.10.2014 19:39
jenom sem vynechal slovo objekt, a jak to mam tedy realizovat?
Zdarec, nevím, jestli chápu správně, co chceš, ale zkusil jsem něco
vytvořit, kdyžtak dej vědět, jestli pomohlo
Main třída:
import java.util.ArrayList;
public class Main {
private final Point[][] coordinations;
private final ArrayList<Point> values = new ArrayList();
private int y;
public Main(){
coordinations = new Point[10][10];
values.add(new Point(43,5));
values.add(new Point(35,10));
values.add(new Point(7,20));
}
public static void main(String[] args) {
Main m = new Main();
m.fillCoords();
m.printCoords();
}
public void fillCoords(){
for (int x = 0; x < values.size(); x++){
System.out.println("Na souradnici: " + x + " " + y + " vkladam: " + values.get(x).getX() + " " + values.get(x).getY());
coordinations[x][y] = values.get(x);
y++;
}
}
public void printCoords(){
y = 0;
for (int x = 0; x < values.size(); x++){
System.out.println("==================================");
System.out.println("Pozice: ");
System.out.println(x + " " + y);
System.out.println("Hodnota: ");
System.out.println(coordinations[x][y].getX() + ", " + coordinations[x][y].getY());
y++;
}
}
}
Třída Point:
public class Point {
private int x = 0;
private int y = 0;
public Point(int x, int y){
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
Tomhaus:21.10.2014 8:01
Já potřebuju do pole polí uložit objekt, kterej bude mít atribut s pozicí(na konec ta pozice bude neměnná) a hodnotu na té pozici. A ještě bych se chtěl zeptat, jak se dají do atributu vyplnit třeba jen ty pozice, když tu hodnotu na té pozici neznám.
Hit:21.10.2014 10:45
V tom případě by ti měl ten kód vyhovovat . Máš tam třídu Point, jejíž
instance představují tu danou pozici (např. 43, 5). Ve třídě Main máš
pole polí typu Point a kolekci ArrayList taky typu Point a funguje to tak, že
si vytvoříš tu hodnotu s pozicí a přidáš ji do ArrayListu. Metodou
fillCoords pak na souřadnice přiřadíš ty hodnoty z Listu, je to postavený
tak, že na pozici [0][0] dáš hodnotu (43,5), na pozici [1][1] dáš (7, 20)
atd.
Hit:21.10.2014 15:43
Jj, ty hodnoty z toho dostanes takhle: coordinations[x][y].getX() / getY()
, ukázku máš v metodě printCoords
Tomhaus:21.10.2014 17:32
Jo a ty si do atributu <i>Point</i> nezahrnul ještě tu hodnotu na té pozici. Takže to tam stačí jenom dopsat do publicu?
Takže ty chceš mít jedno dvourozměrný pole, v dejme tomu Point[10][10],
v tom budou uložený souřadnice např. (10,5) a k tomu budou ještě tyhle
souřadnice mít v sobě uloženou nějakou hodnotu? Kdyžtak pls napiš přesnej
příklad.
Ok, trochu jsem to upravil, přidal jsem tam třídu Value, která představuje danou hodnotu na souřadnici (nevěděl jsem, jak má ta hodnota vypadat, takže jsou tam konstruktory pro 1 i 2 hodnoty)
Main:
public class Main {
/**
* Dvourozměrné pole
*/
private final Position[][] field;
/**
* Kolekce souřadnic
*/
private final ArrayList<Position> coordinations = new ArrayList();
/**
* Pomocná proměnná pro adresování v poli
*/
private int y;
/**
* Xová souřadnice v poli
*/
private int xPos;
/**
* Ypsilonová souřadnice v poli
*/
private int yPos;
/**
* První hodnota na souřadnici
*/
private int a;
/**
* Druhá hodnota na souřadnici
*/
private int b;
/**
* Bezparametrický konstruktor - zinicializuje pole a přidá do ArrayListu
* nové souřadnice spolu s jejich hodnotou
*/
public Main(){
field = new Position[10][10];
coordinations.add(new Position(43,5, new Value(50)));
coordinations.add(new Position(35,10, new Value(20)));
coordinations.add(new Position(7,20, new Value(30)));
}
public static void main(String[] args) {
Main m = new Main();
m.fillCoords();
m.printCoords();
}
/**
* Uloží hodnoty z ArrayListu na určené indexy v poli
*/
public void fillCoords(){
y = 0;
for (int x = 0; x < coordinations.size(); x++){
field[x][y] = coordinations.get(x);
a = field[x][y].getValue().getA();
b = field[x][y].getValue().getB();
xPos = field[x][y].getX();
yPos = field[x][y].getY();
System.out.println("Na index: " + x + " " + y
+ " vkladam: " + xPos + " " + yPos +
" s hodnotou: " + "A: " + a + " B: " + b);
y++;
}
}
/**
* Vypíše indexy, souřadnice a hodnoty pro kontrolu
*/
public void printCoords(){
y = 0;
for (int x = 0; x < coordinations.size(); x++){
a = field[x][y].getValue().getA();
b = field[x][y].getValue().getB();
xPos = field[x][y].getX();
yPos = field[x][y].getY();
System.out.println("==================================");
System.out.println("Index v poli: ");
System.out.println("[" + x + "]" + " " + "[" + y + "]");
System.out.println("Souřadnice: ");
System.out.println(xPos + ", " + yPos);
System.out.println("Hodnota na souřadnici: ");
System.out.println("A: " + a + " B: " + b);
y++;
}
}
}
Position:
public class Position {
private int x = 0;
private int y = 0;
private Value value;
/**
* Konstruktor inicializuje xovou pozici, ypsilonovou pozici a hodnotu
* @param x Souřadnice
* @param y Souřadnice
* @param v Hodnota
*/
public Position(int x, int y, Value v){
this.x = x;
this.y = y;
this.value = v;
}
/**
* Konstruktor inicializuje xovou pozici, ypsilonovou pozici
* @param x Souřadnice
* @param y Souřadnice
*/
public Position(int x, int y){
this(x, y, null);
}
/**
* Vrací X
* @return X
*/
public int getX() {
return x;
}
/**
* Vrací Y
* @return Y
*/
public int getY() {
return y;
}
/**
* Vrací hodnotu
* @return Hodnota
*/
public Value getValue(){
return value;
}
}
Value:
public class Value {
private int a;
private int b;
/**
* Konstruktor pro případ potřeby zadání dvou hodnot
* @param a Hodnota
* @param b Hodnota
*/
public Value(int a, int b){
this.a = a;
this.b = b;
}
/**
* Konstruktor zinicializuje hodnotu a
* @param a Hodnota
*/
public Value(int a){
this(a, 0);
}
/**
* Vrací a
* @return Hodnota
*/
public int getA() {
return a;
}
/**
* Vrací b
* @return Hodnota
*/
public int getB() {
return b;
}
/**
* Vrací hodnotu
* @return Hodnota
*/
public Value getValue(){
return this;
}
}
Jan Vargovský:21.10.2014 22:25
Úplně by ti stačilo místo těch tříd jen udělat 2d pole intů a to už samo o sobě je matice, která jde reprezentovat jako sudoku.
EDIT: čtu zbytek vlákna a trošku mimo. Myslel jsem, že je to jiné téma.
Tomhaus:7.11.2014 17:47
Jo takhle by to šlo jen máš chybu v ukládání těch hodnot: ty hodnoty
to uloží jen po úhlopříčce toho 2D pole. Ale drobet vim, jak bych to
vyřešil, klidně mi můžeš poslat svůj návrh
PS: Sry, že píšu takhle pozdě, teprve teď jsem se do toho pustil
Tomhaus:7.11.2014 17:52
A taky si musíš při psaní toho ukládacího (přiřazovacího) algorytmu uvědomit, že v tom ArrayListu těch souřadnic a hodnot je celkovej počet větší než x-ová souřadnice toho 2D pole, takže by to chtělo trošku upravit.
Jak nad tim přemejšlim, tak ty sis asi myslel, že když to vkládání uděláš takhle, tak se to uloží všude a nejen na tu úhlopříčku.
Věděl jsem, že to bude ukládat do uhlopříčky, ale myslel jsem, že to
tak chceš (špatně jsem si přečetl ten tvůj příklad s ifama )
Tomhaus:7.11.2014 18:04
chci aby se to ukládalo po celim poli, kdybych chtěl úhlopříčku, tak se
neptam, protože to můžu rovnou udělat jednořádkový pole
Tomhaus:7.11.2014 18:06
a píše mi to nějakou chybu: java.lang.ArrayIndexOutOfBoundsException: 9 asi to bude znamenat, že já mam ten ArrayList větší než 9 a že se jich vypsalo jen 9, protože já mam taky to 2D pole 9 x 9 a po každým řádku musim udělat y++
Tomhaus:7.11.2014 18:13
Žádnou chybu to nepíše, když tam místo ArrayList.size() dam číslo
9.
Mam návrh, jak by se to mohlo řešit: co takhle z toho cyklu vyndat to y++,
dát až za ten cykl a celý to zacyklovat? celkem divnej nápad, ale podle
mej teorie by měl fungovat
jakej máš na to ty názor?
Tomhaus:7.11.2014 18:25
Jo a jak mam upravit to coordinations.get(x) ? protože když bych tohle
dal do cyklu s počtem celkovýho počtu položek v ArrayListu, tak by se ty
cykly mezi sebou násobily a to já nechci
Hit:7.11.2014 18:39
public class Main {
/**
* Dvourozměrné pole
*/
private final Position[][] field;
/**
* Kolekce souřadnic
*/
private final ArrayList<Position> coordinations = new ArrayList();
/**
* Uchovává počet vložených Xových prvků do pole
*/
private int xLength = 0;
/**
* Uchovává počet vložených Ypsilonových prvků do pole
*/
private int yLength = 0;
/**
* Xová souřadnice v poli
*/
private int xPos;
/**
* Ypsilonová souřadnice v poli
*/
private int yPos;
/**
* První hodnota na souřadnici
*/
private int a;
/**
* Druhá hodnota na souřadnici
*/
private int b;
/**
* Bezparametrický konstruktor - zinicializuje pole a přidá do ArrayListu
* nové souřadnice spolu s jejich hodnotou
*/
public Main(){
field = new Position[10][10];
coordinations.add(new Position(43,5, new Value(50)));
coordinations.add(new Position(35,10, new Value(20)));
coordinations.add(new Position(7,20, new Value(30)));
}
public static void main(String[] args) {
Main m = new Main();
m.fillCoords();
m.printCoords();
}
/**
* Uloží hodnoty z ArrayListu na určené indexy v poli
*/
public void fillCoords(){
int index = 0;
for (int x = 0; x < coordinations.size(); x++){
for (int y = 0; y < coordinations.size(); y++) {
field[x][y] = coordinations.get(index);
a = field[x][y].getValue().getA();
b = field[x][y].getValue().getB();
xPos = field[x][y].getX();
yPos = field[x][y].getY();
System.out.println("Na index: " + x + " " + y
+ " vkladam: " + xPos + " " + yPos +
" s hodnotou: " + "A: " + a + " B: " + b);
index++;
yLength++;
}
xLength++;
if (index == coordinations.size()){
break;
}
}
}
/**
* Vypíše indexy, souřadnice a hodnoty pro kontrolu
*/
public void printCoords(){
for (int x = 0; x < xLength ; x++){
for (int y = 0; y < yLength; y++){
a = field[x][y].getValue().getA();
b = field[x][y].getValue().getB();
xPos = field[x][y].getX();
yPos = field[x][y].getY();
System.out.println("==================================");
System.out.println("Index v poli: ");
System.out.println("[" + x + "]" + " " + "[" + y + "]");
System.out.println("Souřadnice: ");
System.out.println(xPos + ", " + yPos);
System.out.println("Hodnota na souřadnici: ");
System.out.println("A: " + a + " B: " + b);
}
}
}
}
Tomhaus:7.11.2014 18:47
hele nemělo by bejt u těch cyklů, že se maj taky ukončit v xLength a yLength?
BTW: klidně tam nemusíš psát dvě hodnoty na tej danej pozici, mě tam
stačí jedna
zkusim to otestovat
Tomhaus:7.11.2014 19:04
no trošku sem to upravil a místo coordinations.size() jsem tam dal číslo, protože já vim kolik řádků a sloupců má to 2D pole.
a vyskytla sem tam jedna drobná chybička s tim počítáním toho yLength,
protože ty cykly se mezi sebou násobí, tak když mam pole 9x9 mam yLength 81
a má to bejt jen 9
Tomhaus:7.11.2014 19:12
jo a mam jednu chybu, která se už netýká toho pole a vypisuje se jen
někdy: java.lang.NullPointerException vypisuje se mi tu u rámečku, kterej
vykresluju z jinýho souboru (asi atributu nevim jak ho definovat) v
grafickym paintu pomocí: border.draw(g); to border je jeho název
a píše mi to chybu s nějakým nulovým bodem nebo nevim, co to je
Hit:7.11.2014 19:23
No, možná by sis měl nejdřív pročíst nějaký tutoriály než začneš
něco takovýho dělat.
Přijde mi, že nevíš základní věci.
Hit:7.11.2014 19:28
Upravil jsem to, a při výpisu už mi to nepíše žádnou chybu
public class Main {
/**
* Dvourozměrné pole
*/
private final Position[][] field;
/**
* Kolekce souřadnic
*/
private final ArrayList<Position> coordinations = new ArrayList();
/**
* Délka Xové souřadnice pole
*/
private int xLength = 10;
/**
* Délka Ypsilonové souřadnice pole
*/
private int yLength = 10;
/**
* Xová souřadnice v poli
*/
private int xPos;
/**
* Ypsilonová souřadnice v poli
*/
private int yPos;
/**
* První hodnota na souřadnici
*/
private int a;
/**
* Druhá hodnota na souřadnici
*/
private int b;
private Random r = new Random();
/**
* Bezparametrický konstruktor - zinicializuje pole a přidá do ArrayListu
* nové souřadnice spolu s jejich hodnotou
*/
public Main(){
field = new Position[xLength][yLength];
for (int i = 0; i < 100; i++){
coordinations.add(new Position(r.nextInt(50), r.nextInt(50), new Value(r.nextInt(100))));
}
/*coordinations.add(new Position(43,5, new Value(50)));
coordinations.add(new Position(35,10, new Value(20)));
coordinations.add(new Position(7,20, new Value(30)));*/
}
public static void main(String[] args) {
Main m = new Main();
m.fillCoords();
m.printCoords();
}
/**
* Uloží hodnoty z ArrayListu na určené indexy v poli
*/
public void fillCoords(){
int index = 0;
for (int x = 0; x < xLength; x++){
for (int y = 0; y < yLength; y++) {
field[x][y] = coordinations.get(index);
a = field[x][y].getValue().getA();
b = field[x][y].getValue().getB();
xPos = field[x][y].getX();
yPos = field[x][y].getY();
System.out.println("Na index: " + x + " " + y
+ " vkladam: " + xPos + " " + yPos +
" s hodnotou: " + "A: " + a + " B: " + b);
index++;
}
if (index == coordinations.size()){
break;
}
}
}
/**
* Vypíše indexy, souřadnice a hodnoty pro kontrolu
*/
public void printCoords(){
int x = 0;
int y = 0;
while (field[x][y] != null){
a = field[x][y].getValue().getA();
b = field[x][y].getValue().getB();
xPos = field[x][y].getX();
yPos = field[x][y].getY();
System.out.println("==================================");
System.out.println("Index v poli: ");
System.out.println("[" + x + "]" + " " + "[" + y + "]");
System.out.println("Souřadnice: ");
System.out.println(xPos + ", " + yPos);
System.out.println("Hodnota na souřadnici: ");
System.out.println("A: " + a + " B: " + b);
x++;
y++;
if (y == xLength){
y = 0;
}
if (x == yLength){
break;
}
}
}
}
Tomhaus:7.11.2014 20:05
jo a dá se nějak ta hodnota na té pozici převést na vlákno? abych ji mohl vykreslit
když chci všechny ty hodnoty nechat vyreslit, tak používam:
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; i++){
g.drawString(Integer.toString(coordinations[j][i].getValue()), coordinations[j][i].getX(), coordinations[j][i].getY());
}
}
a vložil jsem tohle do vykreslovače, ale hlásí mi to chybu: Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException
Co s tím mam dělat ikdyž jsem převedl tu hodnotu na té pozici na String?
Hit:7.11.2014 22:43
IndexOutOfBounds znamená, že indexuješ mimo rozsah pole, může to být tím, že máš u těch coordinations prohozeno i/j.
Já to mám takhle a funguje
@Override
public void paint(Graphics g){
g.setColor(Color.BLACK);
int xPos = 20;
int yPos = 10;
for (int x = 0; x < field.length; x++){
for (int y = 0; y < field.length; y++){
g.drawString(Integer.toString(field[x][y].getValue().getA()), xPos, yPos);
g.drawString(Integer.toString(field[x][y].getValue().getB()), xPos + 20, yPos);
yPos += 10;
}
}
}
Tomhaus:8.11.2014 11:42
stokrát sem to prohlížel až sem našel chybu je to v tom druhym cyklu
přičítam 1 ke špatný
proměnný
Tomhaus:8.11.2014 11:56
a ta chyba: java.lang.NullPointerException s ní mam dělat co?
Tomhaus:8.11.2014 12:43
mam ten rámeček a potřebuju zjistit na jakej je pozici, k tomu použiju: border.getX() a border.getY()
a teď potřebuju zjistit, kde se tahle pozice nachází v tom 2D poli
jak tohle mam udělat?
Hit:8.11.2014 13:46
NullPointerException říká, že chceš pracovat s prázdnou hodnotou(NULL). A tu pozici si najdi třeba tak, že si vezmeš to pole, přes for to projedeš a IFem budeš kontrolovat, kde se ta hodnota rovná tý, kterou hledáš.
to s tou pozicí sem už vyřešil přesně takhle
a nevim co je s tou prázdnou hodnotou, odkazuje mě ta chyba na
border.draw(g);
a nevim co to má společnýho s nulovou hodnotou, když ten rámeček má
přesný souřadnice, kde se má zobrazit
Zobrazeno 49 zpráv z 49.