- Fórumok
- Szoftverfejlesztés
- Java programozás
- (kiemelt téma)
- A Linux megnégyszerezte magát a Steamen — a Microsoft ismét ígérget
- Milyen egeret válasszak?
- ThinkPad (NEM IdeaPad)
- Projektor topic
- Fejhallgató erősítő és DAC topik
- Szentjánosbogárral venné fel a versenyt a Macbook Neo ellen az Intel
- E-book olvasók
- Gaming notebook topik
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Vezetékes FEJhallgatók
-
Fórumok
PROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokMobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
Új hozzászólás Aktív témák
-
Sirpi
senior tag
Totál nem értem.
Egyrészt ha 10-et adok meg (előjeles egész 8biten) akkor megegyezik, ha 1000, akkor meg nem? Ez elég nagy logikai bukfenc.Azt is írják, hogy a == nem a két értéket hasonlítja össze, hanem a két címet, amin tárolja a változó tartalmát. Vagyis ha nem ugyanazon a címen tárolja őket, akkor nem lehetnek egyformák. Akkor 127-nél kisebb számnál hogyan lehet egyforma címen két különböző változó értéke?
Furthermore,
==operators in Java is used to compares two memory references and not values.Object1located at say 1000 and contains value 6.Object2located at say 1020 and contains value 6.Object1 == Object2isFalseas they have different memory locations though contains same values.Oké, nem csak a Java-val, az angollal is küzdök, de mit olvastam/értettem félre?
A jvm a -128 és +127 közötti Integereket cache-eli, hogy memóriát és cpu-t spóroljon, így ha ebben az intervallumban hozol egy példányt létre, akkor a cache-ből fogja kiszedni és nem csinál újat (kivéve, ha olyat írsz, hogy new Integer(10), akkor nem tudja a cache-t használni).
-
Sirpi
senior tag
public class Wrap {public static void main(String[] args) {Integer i1 = 1000; // 10Integer i2 = 1000; // 10if (i1 == i2) System.out.println("same");if (i1 != i2) System.out.println("different objects");// System.out.println((i1 != i2) + " " + (i1 == i2) + " " + i1.equals(i2)); }}Nem értem , miért különböző 1000 vagy 10 értékre futtatva az összehasonlítás?
A Java 5-ben implementált Integer cache tehet róla.
-
Sirpi
senior tag
-
Sirpi
senior tag
Nem, mert abban a lépésben egy objectet mappelsz át primitív intre. Mivel ez a streamnek egy metódusa, indokolatlan lenne beleírni extraként, hogy stream. A map is legyen mapStream, a sorted pedig sortedStream? Felesleges zaj lenne.
-
Sirpi
senior tag
-
Sirpi
senior tag
Nem vagyok még teljesen a téma szakértője, valaki biztos szebb választ is tud majd adni, de
Azt hiszem amit kiír az maga a memóriacím ahol a tömböd található, lévén a referencia típusú változók egy referenciát(hivatkozást) tárolnak el.
Az Arrays.toString(tombodValtozoNeve)) amivel megkapod emészthetőbben a tömb tartalmát, vagyis az Arrays osztály toString metódusával.
Ha nem így lenne javítsatok ki.
A tömböknek (szándékosan) nincs felülvágva a toString() metódusa, ez amit látsz, kb. a tömb hashCode-ja (az Object osztály implementációja fut le).
Az Arrays.toString tényleg megoldja a problémát, de ha nem teszel bele effortot, akkor valóban nem írja ki emberi módon a tartalmat. Így pl. ajánlás, ha password fieldet kell a backenden metódusok között átpasszolni, akkor char[] legyen a típus és ne String, nehogy véletlenül bekerüljön a jelszó a logba. -
Sirpi
senior tag
Ha jól emlékszem:
PreferredInterface.super.doStuff()Kötelező definiálni is az osztályban a doStuff metódust ilyenkor, es akkor menni fog, amit irtál.
-
Sirpi
senior tag
(javafx)
A Scene eseménykezelőben, hogy tudom írni a lambda kif. kívüli változókat?double shipAngle = ship.getRotate();scene.setOnKeyPressed(event -> {if (event.getCode() == KeyCode.LEFT) {shipAngle +=-10;//ship.setRotate(shipAngle);}if (event.getCode() == KeyCode.RIGHT) {ship.setRotate(10);}});Nem tudod. Ha mindenképp ilyet szeretnél, akkor a double helyett használhatsz AtomicDouble-t. A lényeg, hogy minden, a lambdán belül használt, de kint definiált változó effectively final kell hogy legyen.
-
Sirpi
senior tag
És amennyiben nincs is szükséged, hogy elérd ezeket a metódusokat, mindig az interface-t használd típusnak, ne a konkrét megvalósítást, mert így bármikor ki tudod cserélni a tényleges típust (pl. LinkedList-re) anélkül, hogy a kódod egyéb részeihez hozzá kellene nyúlnod.
-
Sirpi
senior tag
Megismerkedtem a "stream" technikával. Nagyon tetszik tizen- sorok helyett egy utasításba lefűzni a kódot.
A kérdésem, hogy ez a tömörség csak a forráskódot érinti, vagy a lefordult
bájtkód/végrehajtási sebességet is gyorsítja?
(Biztos össze lehet hasonlítani méréssel, de nem akarom feltalálni a kereket.
)Alapból a stream-nek van minimális overhead-je a hagyományos bejárással szemben, viszont sokkal jobban karbantartható kódot eredményez.
Másrészt ha nagyon heavy a stream kiértékelése (pl. sokmilliós rekordszám), akkor a .parallel() lépést beiktatva a stream-be párhuzamosítja a feldolgozást, és magszám-közeli szorzót lehet így elérni sebességben. -
Sirpi
senior tag
Egy kis stream alap...
A végrehajtásban a .map upperCase -ként fűzi, adja tovább a stream elemet. Ez eddig érthető(számomra). Az .anyMatch -nél nem értem, hogy a kiértékelt boolean eredmény mit jelent. A következő stream ciklusban megint az eredeti következő stream elem lesz manipulálva.
Hogy is van ez?Stream.of("d2", "a2", "b1", "b3", "c").map(s -> {System.out.println("map: " + s);return s.toUpperCase();}).anyMatch(s -> {System.out.println("anyMatch: " + s);return s.startsWith("A");});// map: d2// anyMatch: D2// map: a2// anyMatch: A2A stream-et egy iterátorként fogd fel, és a benne lévő lépések végrehajtódnak minden elemre.
Tehát minden elemre végre fog hajtódni először az upperCase, ami nagybetűsít. Ennek az eredménye megy át elemenként az anyMatch-be, ami megnézi, hogy az adott elem A betűvel kezdődik-e. Az anyMatch egy terminal operátor, vagyis zárja a stream-et, további lépést nem tudsz hozzáfűzni. A visszatérési értéke boolean:boolean anyMatch(Predicate<? super T> predicate)Tehát az egész stream kiértékelés eredménye egy true/false érték, és true akkor, ha valamelyik elem nagybetűsítve A-val kezdődik. Az első sor elejére ezt is írhatod:
boolean existsWithA = Stream.of("d2", "a2", "b1", "b3", "c")...És jelen esetben ez true-t fog visszaadni, de ha az a2-t kiszeded, akkor false-t.
-
Sirpi
senior tag
-
Sirpi
senior tag
Sziasztok!
Segítsetek, ha tudtok légyszi.
Celsius fok átváltás fahrenheitre javával(studicore-os feladat).
Már kész vagyok...
Minden megy, csak a végösszeget az istennek se tudom tizedesvesszővel kiiratni.
Ezt kéne kapnom kimenetben, leszámítva a számok értékeit:
Kérem a Celsius-fok értéket: 100
Fahrenheitben: 212,0 fok.
Eddig jutottam, de ez csak ponttal írja ki a tizedest:
package fahrenheit;
import java.util.Scanner;
/**
*
* @author Nonem
*/
public class Fahrenheit {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
double c,f;
Scanner sc = new Scanner(System.in);
System.out.print("Kérem a Celsius-fok értéket: ");
c = sc.nextDouble();
f = c * 9/5 + 32;
System.out.print("Fahrenheitben: "+f+" fok.");
}
}
Előre is köszi a segítséget.System.out.println(String.format(Locale.forLanguageTag("HU"), "Fahrenheitben: %f fok.", f)); -
Sirpi
senior tag
Ilyesmire gondolsz, hogy például oldjam meg a Fibonacci-t rekurzióval és ciklussal is: ?
public class Fibonacci{
public static void main(String[] args) {
System.out.println(fibonacciRecursion(3));
System.out.println(fibonacciLoop(3));
}
public static int fibonacciRecursion(int n) {
if (n <= 1)
return n;
return fibonacciRecursion(n - 1) + fibonacciRecursion(n - 2);
}
public static int fibonacciLoop(int n) {
int[] arr = new int[n + 1];
for (int i = 0; i < arr.length; i++) {
if (i <= 1)
arr[i] = i;
else
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
}Én mind a két implementációt optimalizálnám.
Az elsőnél az a gond, hogy így baromi lassú, F(n)-t pont F(n) időben fogja kiszámolni, tehát lineáris helyett exponenciális lesz a futásidő. Ezen a már kiszámolt értékek eltárolásával lehet segíteni. Próbáld nagyobb értékkel futtatni, azt hiszem, az int-be 44-ig nem csordul túl, de ha átírod long-ra, akkor 89-ig próbálkozhatsz, azt pedig már lehetetlen kivárni.
A másodiknál pedig felesleges lefoglalni egy teljes tömböt, elég tudni mindig a két utolsó értéket:
if (n <= 1)return n;int a = 0;int b = 1;for (int i = 2; i <= n; i++) {int c = a + b;a = b;b = c;}return b; -
Sirpi
senior tag
Igen, ez igy van, de ettől még az előző példát lehet for ciklusként írni:
for (Iterator<Army> iter = defenderArmies.iterator(); iter.hasNext(); ) {
Army army = iter.next();
army.getArmyLabel().remove();
army.remove();
} -
Sirpi
senior tag
-
Sirpi
senior tag
Köszi! Így már kezdem kapisgálni. xmx 4096-ra van állítva. Csak furi volt, mert 6 giga ramból ~ 30% szabad maradt. 1.79 GiB free / 1.25 GiB cached. A javas alkalmazás meg azt írja, RAM Used: 2457. így viszont kijön a matek. 1.79+1.25+2.45 = 5.49 a maradék ~ 500 megát meg a rendszer és egyéb cuccok eszik el. 2.45+1.25 = 3.7 (~4gb)
Más. Javahoz full kuka vagyok és a google sem barátom most. Nem tudom szokás e ilyet kérni, de egy kódot valaki ki tudna nekem egészíteni vagy útba tudna igazítani?
[link]
Ez egy bugreport rendszer ingame. A 110-es sor szerint "reportoló karakter neve.txt" -ként menti a reportokat, és (113-117-sor) nem enged 1 karakternek több "aktív" reportot küldeni.Ez így nekünk nem jó, mert testing phase van, és jó lenne minél több bugról értesülni.
Arra gondoltam, a 113-117 sorokat megszüntetném, a 110-es sort meg kiegészíteném egy időbélyeggel. (System.currentTimeMillis())
Csak nem tudom, hogyan. Mert ehhez valóban hülye vagyok.

A 110-es sort cseréld ki erre (igy csak másodpercen belül lehet egy usernél ütközés):
String timeStamp = new SimpleDateFormat("YYYY-MM-dd-HH-mm-ss").format(new Date());
String fname = "data/BugReports/" + player.getName() + "-" + timeStamp + ".txt";Egyébként pedig a dátum formátumát úgy állítod be, ahogy szimpatikus. Azért választottam ezt, mert így se pont, se szóköz nem lesz benne.
-
Sirpi
senior tag
Spring boot példából:
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }Ez mi? Mindent 2 módon kell leírni ezentúl?
Az a legnehezebb hogy a programozó tudja mikor melyik módszert kell alkalmazni.A fő példa a Java8-as Stream API, a kikommentezett rész pedig a hagyományos foreach, ha valaki nem akar (vagy Java 7 miatt nem tud) Stream API-t használni. Teljesen mindegy, melyiket használod, de a Stream API egyre elterjedtebb.
-
Sirpi
senior tag
IntelliJ Idea
A legjobb az összes közül, mára kb. de facto. A teljes változat fizetős, de van belőle community edition is, és a jó pár dologra az is megfelel. -
Sirpi
senior tag
-
Sirpi
senior tag
Ez a rész háromszor is szerepel: gyum.toString().contains(nev)
Egyrészt a harmadik automatikusan teljesülni fog, elhagyható, egyetlen vizsgálat is elég. Másrészt gondolom az elso gyum helyett az ertekek változót akartad használni, így az értékek.contains(nev) pont az, amire szükséged van, sőt, a toString-ezés miatt ha akár egyetlen betűt írsz be, ami a felsorolt gyümölcsök valamelyikében szerepel, azt is el fogja fogadni, nem néz teljes egyezést. Kicsit egyszerűsítve:
public static void kaloriaKiir(List<Gyumolcs> ertekek) {
Scanner scan = new Scanner(System.in, "ISO-8859-2");
System.out.println("Kérem a gyümölcs nevét: ");
String nev;
while (!ertekek.contains(nev = scan.nextLine())) {
System.out.println("Nem megfelelő név, újat kérek!");
}
System.out.println("Kérem a mennyiséget grammban: ");
int menny = scan.nextInt();
for (Gyumolcs gyum : ertekek) {
if (nev.equals(gyum.Megnevezes)) {
System.out.println(menny + " gramm " + gyum.Megnevezes + " " + gyum.kcal / 100 * menny + " gramm kalóriát tartalmaz.");
}
}
}Miután elküldtem, rájöttem, hogy az ertekek.contains(nev) nem lesz jó, mert egy List<Gyumolcs> sosem tartalmazhat String-et, de ettől még áll, amit írtam, hogy a toString()-ezés nem a jó irány. Például:
private static boolean isNameValid(List<Gyumolcs> ertekek, String nev) {
for (Gyumolcs gyum : ertekek) {
if (gyum.getName().equals(nev)) {
return true;
}
}
return false;
}És akkor ezt a metódust lehet hívni a while ciklusból. A gyum.Megnevezes-t pedig engedelmeddel getter-re cseréltem, nem használunk field-et közvetlenül (és nem is kezdjük a nevét nagybetűvel).
-
Sirpi
senior tag
Do-while-lal oldottam meg végül, köszi.
public static void kaloriaKiir(ArrayList<Gyumolcs> ertekek, File f) {
Scanner scan = new Scanner(System.in, "ISO-8859-2");
System.out.println("Kérem a gyümölcs nevét: ");
String nev = scan.nextLine();
do {
if (!gyum.toString().contains(nev)) {
System.out.println("Nem megfelelő név, újat kérek!");
nev = scan.nextLine();
}
} while (!gyum.toString().contains(nev));
if (gyum.toString().contains(nev)) {
System.out.println("Kérem a mennyiséget grammban: ");
int menny = scan.nextInt();
for (Gyumolcs gyum : ertekek) {
if (nev.equals(gyum.Megnevezes)) {
System.out.println(menny + " gramm " + gyum.Megnevezes + " " + gyum.kcal / 100 * menny + " gramm kalóriát tartalmaz.");
}
}
}
}Biztos sok sok furcsaság van a kódban, de most a cél átmenni a vizsgán.
![;]](//cdn.rios.hu/dl/s/v1.gif)
Ez a rész háromszor is szerepel: gyum.toString().contains(nev)
Egyrészt a harmadik automatikusan teljesülni fog, elhagyható, egyetlen vizsgálat is elég. Másrészt gondolom az elso gyum helyett az ertekek változót akartad használni, így az értékek.contains(nev) pont az, amire szükséged van, sőt, a toString-ezés miatt ha akár egyetlen betűt írsz be, ami a felsorolt gyümölcsök valamelyikében szerepel, azt is el fogja fogadni, nem néz teljes egyezést. Kicsit egyszerűsítve:
public static void kaloriaKiir(List<Gyumolcs> ertekek) {
Scanner scan = new Scanner(System.in, "ISO-8859-2");
System.out.println("Kérem a gyümölcs nevét: ");
String nev;
while (!ertekek.contains(nev = scan.nextLine())) {
System.out.println("Nem megfelelő név, újat kérek!");
}
System.out.println("Kérem a mennyiséget grammban: ");
int menny = scan.nextInt();
for (Gyumolcs gyum : ertekek) {
if (nev.equals(gyum.Megnevezes)) {
System.out.println(menny + " gramm " + gyum.Megnevezes + " " + gyum.kcal / 100 * menny + " gramm kalóriát tartalmaz.");
}
}
} -
Sirpi
senior tag
Oh, az első kérdést nem olvastam, az már tényleg nem lenne egyszerű.

Ilyesmire gondoltál?
Persze ha a pánikkeltés a cél, akkor biztosan cifrázható tovább.
String[] arrayOfStrings = { "alma", "körte", "banán", "cseresznye", "áfonya" };
String longest = Arrays.stream(arrayOfStrings)
.collect(Collectors.maxBy(Comparator.comparing(String::length)))
.orElse(null);
(a kedvedért több sorba törtem
)A reduce nekem valamiért testhezállóbb volt, talán azért is, mert ritkán használok spéci collectorokat. Hirtelen nem is tudnám most rövidebben leírni collectorral, és ezt már én is túlzásnak érzem. Ízlés dolga. A for ciklus a tuti, azt mindenki érti és villámgyors.
Én így írnám, felesleges a reduce meg a collect is:
String[] arrayOfStrings = { "alma", "körte", "banán", "cseresznye", "áfonya" };
String longest = Arrays.stream(arrayOfStrings)
.max(Comparator.comparingInt(String::length))
.orElse(null); -
Sirpi
senior tag
Egy elméleti, amolyan programozás technikai kérdés merült fel bennem.
Sajnos nagyon alap, de elbizonytalanodtam, a segítségeteket kérném.Tételezzük fel hogy autók adatait szeretném egy felületen feldolgozni, majd egyszerű CRUD műveletekkel adatbázisban használni.
Van egy "Car" model, ami ugye tartalmazza az autó adatait. Ezt a service rétegben dolgozom fel. Ha letárolom akkor átkerül a perzisztens rétegbe, ahol egy "CarDAO" lesz. Ebben van már adatbázisban található ID is, mert update/delete művelethez kelleni fog.
A problémám az, hogy mondjuk update/delete esetén, amikor amikor a "service" rétegben meghívom a perzisztens réteg updateCar/deleteCar funkcióit, akkor át kell adnom neki egy ID-t, hogy melyikkel dolgozzon. Ergo a "service" rétegben is tudnom kell az ID-t. Vagyis egy listázásnál mondjuk, amiből mondjuk egy kattintás a felületen a megfelelő sorban az update/delete, mintha a CarDAO objektumot adnám neki vissza. Ami esetemben "CarDAO" == "Car"+ID
Hogyan kellene ezt szépen megoldani, hogy a service réteg ne DAO-t kapjon, hanem Model-t?A modelben is szerepeljen az ID field, és amikor pl. listából kiválasztasz egy elemet, akkor tudsz ID alapján módosítani/törölni.
-
Sirpi
senior tag
Üdv!
Bár a megoldás működik, nem tartom elegánsnak. Ha esetleg valaki tudna egy szebb megoldást, megköszönném.
Gyakorolgatom SE tudásomat és egy táblajátékot írok. 1, 2, 3, 4-el (plusz enter) lehet lépkedni a négy irányba, a lépés előtt vizsgálom a lehetséges lépésirányokat, amit beleteszek egy négy elemű boolean tömbbe (minden lépés előtt frissülő statikus tömb). A tömb alapján listázódnak ki a lehetséges lépésirányok. A kiíráshoz használom a tömb indexeit. A feldobott lehetséges irányokból az int movementDirection adja meg egy másik metódusnak a lépés irányát. Viszont arra is kell figyelnem, hogy csak 0-3 közötti szám legyen értéke, nehogy tömbindexelési kivételbe fussak (kivételkezelés alapfokon). A kódom:
public static int listPossibleSteps() {
//indexes of possibleSteps: 0: left; 1: up; 2: right; 3: down
int movementDirection = 0;
System.out.println("");
for (int i = 0; i < possibleSteps.length; i++) {
if (possibleSteps[i]) {
System.out.print((i + 1) + " - ");
switch (i) {
case 0:
System.out.print("Move left\n");
break;
case 1:
System.out.print("Move up\n");
break;
case 2:
System.out.print("Move right\n");
break;
case 3:
System.out.print("Move down\n");
break;
}
}
}
do {
do {
movementDirection = extra.Console.readInt("Please select: ");
} while (movementDirection < 1 || movementDirection > 4);
movementDirection--;
} while (!possibleSteps[movementDirection]);
return movementDirection;
}Működik, de ez a két do-while a végén nekem elég szar megoldásnak tűnik. Esetleg lenne rá szebb kód?
Köszi!
do {
movementDirection = extra.Console.readInt("Please select: ");
} while (movementDirection < 1 || movementDirection > 4 || !possibleSteps[--movementDirection]); -
Sirpi
senior tag
Köszi a választ, még nem tudtam megoldani, de küzdök vele.

Amúgy azért raktam listába, mert onnan könnyebben ki tudtam írni formázva, ha erre tudsz egy jobb megoldást, azt is szívesen veszem.
Sőt, mondok jobbat:
for (Map.Entry<String, Set<String>> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": ");
for (String str : entry.getValue()) {
System.out.println(str);
}
} -
Sirpi
senior tag
Köszi a választ, még nem tudtam megoldani, de küzdök vele.

Amúgy azért raktam listába, mert onnan könnyebben ki tudtam írni formázva, ha erre tudsz egy jobb megoldást, azt is szívesen veszem.
beírtam az előbb
-
Sirpi
senior tag
Sziasztok!
Tudnátok ebben segíteni?
Ott van a probléma, hogy ha a map-ben egy kulcshoz olyan értékek tartoznak, ahol több utcanév megegyezik, a házszámoknál nem rendezi jól a TreeSet az értékeket.
Például a narancs-hoz megkapjuk, hogy Vag utca 9. és Vag utca 10., de ezt fordított sorrendben fogja kiírni, mert az 1 kisebb a 9-nél. Hogy lehetne itt megoldani, hogy házszám szerint is jól működjön?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Test {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String sor;
String cim;
String[] token;
String[] ajandekok;
Map<String, Set<String>> map = new TreeMap<>();
while ((sor = br.readLine()) != null) {
token = sor.split(";");
cim = token[1].concat(" ").concat(token[2]).concat(".");
ajandekok = token[3].split(",");
for (int i = 0; i < ajandekok.length; i++) {
if (!map.containsKey(ajandekok[i]))
map.put(ajandekok[i], new TreeSet<String>());
map.get(ajandekok[i]).add(cim);
}
}
List<Map.Entry<String, Set<String>>> list = new ArrayList<>();
list.addAll(map.entrySet());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getKey() + ": ");
System.out.println(list.get(i).getValue().toString().replace("]", "")
.replace("[", "").replace(", ", "\n"));
}
}
}
/*tesztadat:
Petike;Vag utca;9;dio,alma,mogyoro
Petracska;Vag utca;10;banan,narancs
Pistike;Vag utca;9;alma,mogyoro,narancs
Lilianna;Szotyori utca;30;mogyoro,banan
*/Egyébként a végén a listába pakolás minek?
for (Map.Entry<String, Set<String>> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": ");
System.out.println(entry.getValue().toString().replace("]", "")
.replace("[", "").replace(", ", "\n"));
} -
Sirpi
senior tag
Sziasztok!
Tudnátok ebben segíteni?
Ott van a probléma, hogy ha a map-ben egy kulcshoz olyan értékek tartoznak, ahol több utcanév megegyezik, a házszámoknál nem rendezi jól a TreeSet az értékeket.
Például a narancs-hoz megkapjuk, hogy Vag utca 9. és Vag utca 10., de ezt fordított sorrendben fogja kiírni, mert az 1 kisebb a 9-nél. Hogy lehetne itt megoldani, hogy házszám szerint is jól működjön?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Test {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String sor;
String cim;
String[] token;
String[] ajandekok;
Map<String, Set<String>> map = new TreeMap<>();
while ((sor = br.readLine()) != null) {
token = sor.split(";");
cim = token[1].concat(" ").concat(token[2]).concat(".");
ajandekok = token[3].split(",");
for (int i = 0; i < ajandekok.length; i++) {
if (!map.containsKey(ajandekok[i]))
map.put(ajandekok[i], new TreeSet<String>());
map.get(ajandekok[i]).add(cim);
}
}
List<Map.Entry<String, Set<String>>> list = new ArrayList<>();
list.addAll(map.entrySet());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getKey() + ": ");
System.out.println(list.get(i).getValue().toString().replace("]", "")
.replace("[", "").replace(", ", "\n"));
}
}
}
/*tesztadat:
Petike;Vag utca;9;dio,alma,mogyoro
Petracska;Vag utca;10;banan,narancs
Pistike;Vag utca;9;alma,mogyoro,narancs
Lilianna;Szotyori utca;30;mogyoro,banan
*/A cim-hez készíts egy saját struktúrát, legyen neki String street-je és int houseNumber-e, és definiálj ezen a struktúrán te magad egy rendezést, pl.
Comparator<Address> comparator = Comparator.comparing(Address::street).thenComparingInt(Address::houseNumber);És ezt a comparatort átadva TreeSet konstruktorába pont jó lesz a rendezés.
-
Sirpi
senior tag
Sziasztok!
Szeretném egy java-ban tapasztaltabb felhasználó segítségét kérni
Most tanulom a nyelvet és dupla vagy semmi alapon belevágtam egy (számomra) összetettebb feladatba. Nos, nem tudom, hogy mennyire tekinthető ez a kód szépnek, egyik első összetettebb próbálkozásom.Azt szerettem volna megvalósítani, hogy a program kérje be egy osztály diákjainak a számát.
Létrehoz két akkora tömböt, amekkora az osztálylétszám.
Ezután bekéri sorban a diákok dolgozat pontszámait annyiszor, ahány diák van (do while ciklussal csináltam).
Ezeket a pontokat a diakok nevű tömbben elhelyezi sorban.
Ezután a pontokból megállapítja az érdemjegyet és az érdemjegyet elhelyezi a jegyek nevű tömbben, szintén sorban.
A végén pedig szeretném, ha kiírná egymás alatti sorokba a diák számát, mellé a pontját és az érdemjegyét.A fordító 3 db hibát jelez:
osztalyzatok.java:27: error: illegal start of type
if (szamlalo = diakszam){
^
osztalyzatok.java:27: error: <identifier> expected
if (szamlalo = diakszam){
^
osztalyzatok.java:27: error: ';' expected
if (szamlalo = diakszam){
^
Valaki tudna segíteni, hogy ezt a 3 hibát hogyan tudnám megszüntetni?Maga a programkód:
import java.util.Scanner;
class osztalyzatok{
public static void main(String[] arguments){
Scanner sc = new Scanner(System.in);
System.out.println("");
System.out.println("Diákok száma:");
int diakszam = sc.nextInt();
int diakok[] = nextInt[diakszam];
int jegyek[] = nextInt[diakszam];
int szamlalo = 1;
int szamlalo2 = 0;
int jegy;
do{
System.out.println("");
System.out.println("Az " + szamlalo + " diák pontszáma:");
int pont = sc.nextInt();
diakok[szamlalo2] = pont;
if (pont <= 100 & pont > 80){jegyek[szamlalo2] = 5;}
else if (pont <= 80 & pont > 70){jegyek[szamlalo2] = 4;}
else if (pont <= 70 & pont > 60){jegyek[szamlalo2] = 3;}
else if (pont <= 60 & pont > 50){jegyek[szamlalo2] = 2;}
else if (pont <= 50 & pont >= 0){jegyek[szamlalo2] = 1;}
szamlalo++;
szamlalo2++;
}
while (szamlalo <= diakszam);}
if (szamlalo = diakszam){
szamlalo2 = 0;
for (x = 1; x <= diakszam; x++)
System.out.println("");
System.out.println("Az első diák pontja: " + diakok[szamlalo2] + "Érdemjegye: " + jegyek[szamlalo2]);
szamlalo2++;
}
}
Egyenlőség vizsgálatára az == való
Ebben a sorban nem felesleges a } ?
while (szamlalo <= diakszam);}És nézz utána, mi a különbség a & és a && között, utóbbi hatékonyabb (nem nézi tovább a feltételt, ha már biztosan tudja az eredményét)
-
Sirpi
senior tag
Az első 100 prímszámot szeretném tömbbe kiiratni. Ezzel a kódommal az a gond, hogy az üres elemeket is beleteszi a tömbbe. Mit szúrtam el?
public class prim100 {
public static void main(String[] args) {
boolean prim = true;
int szamlalo = 0;
int tomb[]=new int[1000];
int i = 1;
do{
i++;
prim = true;
for (int j = 2; j <= Math.sqrt(i); j++){
if (i % j == 0){
prim = false;
break;
}
}
if(prim == true){
System.out.print(i + " ");
tomb[i]=i;
szamlalo++;
}
}while(szamlalo != 100);
// tömb elemeinek kiíratása
System.out.println("\n" +"A tömb elemei:");
for( int k = 0; k < tomb.length; k++ )
{
System.out.print(tomb[k]+" ");
}
}
}Itt a hiba:
tomb[i]=i;ehelyett ez kell:
tomb[szamlalo]=i;és a tomb elég, ha 100 elemű
-
Sirpi
senior tag
Sziasztok!
Abszolút kezdőként ismerkedem a Java nyelvvel.
A Kiválogatás programozási tételét szeretném megcsinálni.
JavaScriptben sikerült is összehozni, de Java-ban az a gondom, hogy mindenképp meg kell határozni előre a tömb méretét, míg JS-ben nem kellett. Persze lehet, hogy rosszul tudom.
Az ArrayList használata nélkül megoldható?
int tomb[] = {2,6,12,8,5,3,16};
int j = 0;
int[] ujTomb; //itt ugye ez nem működik
for(int i=0;tomb.length > i;i++){
if(tomb[i] > 8 ){
ujTomb[j++] = tomb[i];
}
}
System.out.println("J értéke:" + j);A tömb fix méretű, valóban nem tudsz ilyet csinálni.
Használhatsz helyette ArrayList-et, viszont akkor nem tudsz primitív típust tárolni benne, csak Integer-t.
A másik megoldás a Java 8 és a Stream API:int tomb[] = {2,6,12,8,5,3,16};
int ujTomb[] = Arrays.stream(tomb).filter(k -> k > 8).toArray();vagy ha csak a darabszám érdekel:
long count = Arrays.stream(tomb).filter(k -> k > 8).count(); -
Sirpi
senior tag
Sziasztok!
Kérnék szépen egy kis segítséget!
Az alábbi program kódba..., tanulom a Jáva programnyelvet de most kicsit elakadtam.
Azt szeretném elérni, hogy ha döntettlenre jön ki a dobás akkor kezdje előről a a programfutást. Sehogy se tudom "returnolni".
Tudomnem egy "CleanCode", de az alapok megértésén vagyok.
package tester;
public class Tester {
public static void main(String[] args) {
Engine start = new Engine();
start.Dice();
System.out.println("");
if ("You".equals(start.toString())) {
System.out.println("Nyertél!");
} else if ("Computer".equals(start.toString())) {
System.out.println("Vesztettél!");
} else {
System.out.println("Döntettlen!");
}
}
}package tester;
import java.util.Random;
public class Engine {
@Override
public String toString() {
if (You > Computer) {
return "You";
} else if (Computer > You) {
return "Computer";
} else {
return "Draw";
}
}
int You = random();
int Computer = random();
public static void six() {
System.out.print("---------\n| * * |\n| * * |\n| * * |\n---------");
}
public static void five() {
System.out.print("---------\n| * * |\n| * |\n| * * |\n---------");
}
public static void four() {
System.out.print("---------\n| * * |\n| |\n| * * |\n---------");
}
public static void three() {
System.out.print("---------\n| * |\n| * |\n| * |\n---------");
}
public static void two() {
System.out.print("---------\n| * |\n| |\n| * |\n---------");
}
public static void one() {
System.out.print("---------\n| |\n| * |\n| |\n---------");
}
public static int random() {
Random r = new Random();
int a = r.nextInt(6) + 1;
return a;
}
public void Dice() {
System.out.println("Your dice: ");
switch (You) {
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
}
System.out.println("\n");
System.out.println("Computer's dice: ");
switch (Computer) {
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
}
if (You > Computer) {
System.out.println("\n");
System.out.println("You won!");
} else if (Computer > You) {
System.out.println("\n");
System.out.println("You lost!");
} else {
System.out.println("\n");
System.out.println("Draw!");
}
}
}public static void main(String[] args) {
boolean draw = true;
do
{
Engine start = new Engine();
start.Dice();
System.out.println("");
if ("You".equals(start.toString())) {
System.out.println("Nyertél!");
draw = false;
} else if ("Computer".equals(start.toString())) {
System.out.println("Vesztettél!");
draw = false;
} else {
System.out.println("Döntettlen!");
}
}
while (draw);
} -
Sirpi
senior tag
A startGame metódusban ez van:
evaluation(playingDeck, playerBet, delaer, delaer);
A 2. paraméternek playernek kellene lennie. (Egyébként a dealer szót így írják helyesen, légyszi írd át)Igazából sokkal tisztább lenne a kód, ha a player és a dealer két példányváltozó lenne, nem pedig egy metódusban létrehozott belsó változók, amiket mindig továbbadsz paraméterként. Akkor pl. ezt a hibát nem követted volna el.
Az ékezetes enum-okat pedig ne használd (hosszú ő-vel különösen ne).
A 2. helyett a 4. paraméterre gondoltam ( a Player paraméterek közül a 2.)
-
Sirpi
senior tag
Üdv mindenkinek!
Javat kezdtem tanulni, és készítettem egy BlackJack játékot. A futtatásakor viszont vannak érdekességek, így például a feltételek vizsgálata olyan mintha nem futna le, minden leosztásra döntetlent ír, ami nyilván nem igaz. Továbbá a választási lehetőségeknél (userinput '1' vagy '2' ) nem számít a bevitt szám, a 3 esetén is fut.
Az egész kódot ide nyilván nem rakom be, ha valakinek van ideje ránézni azt megköszönném. LINKA startGame metódusban ez van:
evaluation(playingDeck, playerBet, delaer, delaer);
A 2. paraméternek playernek kellene lennie. (Egyébként a dealer szót így írják helyesen, légyszi írd át)Igazából sokkal tisztább lenne a kód, ha a player és a dealer két példányváltozó lenne, nem pedig egy metódusban létrehozott belsó változók, amiket mindig továbbadsz paraméterként. Akkor pl. ezt a hibát nem követted volna el.
Az ékezetes enum-okat pedig ne használd (hosszú ő-vel különösen ne).
-
Sirpi
senior tag
Sziasztok!
Arra tudtok-e jó és megfelelő leírást, hogy meg tudjam jól tanulni, hogy miért érdemesebb StringBuilderrel .append()-olni a stringeket, mint hogy a '+' -al konkatenáljam össze őket? köszönöm
Úgy tudom, hogy szűken 1-2 mondatban leírva az append azért jobb, mert nem hoz létre feleslegesen köztes objektumokat a memóriában mint a + csinál, ha például több String-et kell összefűznie. Ha például 4 stringet fűzössze + -al, akkor az első és másodikat összefűzi és lefoglal neki külön memóriát, majd ahhoz fűzi a 3.-at és annak is külön object-et foglal le, mielőtt a 4.-et hozzá fűzné.
Ja, pont amiatt, amit mondasz. Viszont futtasd le ezt a két ciklust külön-külön és nem kell más magyarázat:
String resultString = "";
for (int i = 0; i < 1000000; i++) {
resultString += "a";
}StringBuilder resultStringBuilder = new StringBuilder();
for (int i = 0; i < 1000000; i++) {
resultStringBuilder.append("a");
} -
Sirpi
senior tag
Es ha mondjuk ez a fix fejléc (házi része):
Public class PriorityQueue<T extends Comparable<T>>
akkor ennek a constructor-javal lehet akar arraylistet is letrehozni?
valahogy igy:
public class PriorityQueue<T extends Comparable<T>> {
private ArrayList<T> queue;
private int maxElements;
public PriorityQueue(int maxElements){
this.maxElements = maxElements;
queue = new ArrayList<T>();
}Szóval a problémám az hogy a classom neve megyezeik( a feladat kiirasat be kell tartani...) a java collectionban levő egyik class nevével (PriorityQueue), akkor ez azt jelenti, hogy csak ennek megfelelő classot tudok letrehozni a classommal, vagy akarmit, mert a peldanyositasnal a standard class nevet felülirja, es azt csinalja vele amit en definialtam?
Mivel a PriorityQueue a java.util-ban van, ezért ha nem húzod be importtal, nem fognak "összeakadni"
Amúgy meg ha kellene mindkettő ugyanabban az osztályban, akkor az egyiket teljes eléréssel (pl. java.util.PriorityQueue), a másikat importálva tudod használni. -
Sirpi
senior tag
A kiíró for ciklust is lehetne szebben írni, pl. nézhetne ki így az inicializálás utáni rész:
for (Domino domino : myList) {
pw.println(domino.getX());
pw.println(domino.getY());
System.out.println("elküldve");
}
Iterator<Domino> it = myList.iterator();
while (it.hasNext()) {
it.remove();
}Vagy az iterátoros rész helyett ennyi is elég lenne, ha csak a funkcionalitásra megyünk:
myList.clear(); -
Sirpi
senior tag
Üdv!
Javaban egy akasztófa játékot kell csinálnom.
A program nagy része kész, már csak a kép megjelenítése hiányzik, amit én előre elkészített .jpg képekkel oldanék meg, (6 db van) amit a hibázások száma alapján cserélgetek.
Csináltam egy metódust, ami minden karakter megnyomás után lefut, és beállítja a képet a hibák alapján, így néz ki:public Icon faimg(int hiba) {
ImageIcon kep = new ImageIcon();
String elut = " ";
switch (hiba) {
case 0: kep = new ImageIcon("G:\\Netbeans\\Java\\akasztofa\\img\\af_0.jpg"); break;
case 1: kep = new ImageIcon("G:\\Netbeans\\Java\\akasztofa\\img\\af_1.jpg"); break;
case 2: kep = new ImageIcon("af_2.jpg"); break;
case 3: kep = new ImageIcon("af_3.jpg"); break;
case 4: kep = new ImageIcon("af_4.jpg"); break;
case 5: kep = new ImageIcon("af_5.jpg"); break;
case 6: kep = new ImageIcon("af_6.jpg"); break;
}
(Próbáltam direkt kétféleképpen is, de egyikkel se megy a dolog)Ezt lefuttatom minden gombnyomás után:
kep = muvelet.faimg(hiba);
keplabel.setIcon(kep);Nem akarja megjeleníteni a képet, nem tudom mit rontok el

System.out.println-el is megnéztem, a kep megkapja az értéket (elérési utat), de amint lefut, az eredeti fehér kép helyén a keplabel-en semmi nem lesz, a fehér kép is eltünik.
Ha szükséges a forráskódot is meg tudom mutatni.
Ha mág megoldódott, egy kis optimalizáció:
A switch helyett elég ennyi:kep = new ImageIcon("af_" + hiba + ".jpg");
-
Sirpi
senior tag
Itt vajon miért kapom swingben a következő hibaüzenetet?
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "1 0000"
private void bt0ActionPerformed(java.awt.event.ActionEvent evt) {
if (kiiras.getText().length() < 20) {
String outPut=kiiras.getText() + "0";
outPut= outPut.replaceAll("\\s+", "");
outPut=String.format("%, d", Integer.parseInt(outPut));
kiiras.setText(outPut);
}
}Ez a "0" gomb lenne egy számológépben.
Valamiért mintha nem távolítaná el a space-eket a formázott kiírásból.A parseInt nem kezeli a belső szóközöket.
Új hozzászólás Aktív témák
-
Fórumok
PROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokMobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
- Fórumok
- Szoftverfejlesztés
- Java programozás
- (kiemelt téma)
A topicot kiemeltem. Valaki nem akar egy nyitó hsz-t írni?:))
- ÚJ Lenovo Legion Pro 7 Intel Core i9-14900HX, 32GB, 1TB SSD, RTX 4090(16GB), IPS 240Hz
- Eladó Samsung Galaxy A55 5G 8/128GB Lemon / 12 hónap jótállás
- ÚJ Lenovo LOQ Intel Core i7-13650HX, 32GB, 1TB, RTX 5060(8GB), FHD 144Hz
- BESZÁMÍTÁS! ASUS ProArt RTX 4060 8GB videokártya garanciával hibátlan működéssel
- Apple iPhone 14 Pro Max 128 GB Black 100% Akku 1 év Garancia Beszámítás Házhozszállítás
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest


)

![;]](http://cdn.rios.hu/dl/s/v1.gif)
Persze ha a pánikkeltés a cél, akkor biztosan cifrázható tovább.
)



