Toon posts:

Werken met "List" in Java.

Pagina: 1
Acties:
  • 122 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Kan iemand mij misschien sourcecode laten zien waarin een "List" is verwerkt en waar je bijvoorbeeld met een "Button" iets uit list1 in list2 kan zetten. Moet heel makkelijk zijn, maar ik heb nog nooit met een List gewerkt. Ik weet wel hoe je een list moet toevoegen (zelfde als buttons en textfields) maar hoe laat ik dan dingen (bijvoorbeeld namen) in een list zetten uit bijvoorbeeld een textfield of een andere list?
Kan iemand mij hiermee helpen? Alvast bedankt.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Uit je post begrijp ik dat je een java.awt.List bedoelt, er is namelijk ook nog een java.util.List, waarbij mijn hart openspringt van vreugde als iemand die gebruikt ;)

Voor al dergelijke vragen: bekijk gewoon de javadoc! Alle mogelijkheden staan daar perfect in uitgelegd.

Uit de docs voor java.awt.List haal ik bijvoorbeeld:
public void add(String item)

Adds the specified item to the end of scrolling list.
Als je dynamisch items wilt gaan tevoegen, zal dit moeten via een ActionListener op je knop of textveld.

Bekijk ook eens de Java Tutorial. The Real Big Index is ook erg makkelijk.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
volgens mij kom ik er nu wel uit.
rete bedankt voor je snelle reactie! B-)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
b00tje: volgens mij kom ik er nu wel uit.
rete bedankt voor je snelle reactie! B-)
Graag gedaan :) .

Als je in Java programmeert (en in elke andere taal) moet je altijd de API docs bij de hand hebben. Onmisbaar :) . Kennis is niet belangrijk, weten hoe je iets moet vinden wel :) . Je kan de docs ook gewoon downloaden, zodat je ze offline kan gebruiken ( http://java.sun.com/j2se/ ).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:25

momania

iPhone 30! Bam!

Op maandag 15 oktober 2001 21:28 schreef mbravenboer het volgende:
...er is namelijk ook nog een java.util.List, waarbij mijn hart openspringt van vreugde als iemand die gebruikt ;)
hèhèhè.. Collection Framework heerst!! ;)

Neem je whisky mee, is het te weinig... *zucht*


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
momania: hèhèhè.. Collection Framework heerst!! ;)
Exactly ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Ik moet zeggen dat het een hele verbetering zou zijn als je die collections ook zou kunnen gebruiken zonder helemaal naar Object te casten.

Is dit ook een van de dingen die verbeterd zijn in 1.4, nu die ook 'templates' ondersteunt?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

een list is een wrapper class, en maakt geen copy van de array waarvan je hem maakt. hier een stukje code om dit te illustreren:
code:
1
2
3
4
5
6
    String[] days = {"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
    java.util.List dayList = Arrays.asList(days);

    String s1 = (String)dayList.get(0);
    days[0] = "MON";
    String s2 = (String)dayList.get(0);

s1 bevat de string "Mon"
s2 bevat de string "MON"

even een puntje om rekening mee te houden :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
farlane: Ik moet zeggen dat het een hele verbetering zou zijn als je die collections ook zou kunnen gebruiken zonder helemaal naar Object te casten.
Helemaal mee eens :) .
Is dit ook een van de dingen die verbeterd zijn in 1.4, nu die ook 'templates' ondersteunt?
1.4 ondersteunt geen geparameterizeerde typen. Oorspronkelijk gingen er geruchten dat geparameterizeerde typen (en methoden) in 1.4 zouden worden opgenomen, maar dit is uitgesteld tot 1.5 (gelukkig). Er is er echter al wel een prototype compiler, die behoorlijk goed werkt (zie mijn signature voor de link).

Ik gebruik de prototype compiler voor al mijn werk in Java. Het werkt vrijwel uitstekend. In de huidige versie zitten een aantal bugs, maar die zijn makkelijk te omzeilen. Binnenkort komt er al een nieuwe versie uit. Hij is volledig open-source en hij is verder gelijk aan de compiler voor 1.4 (behalve dat daar geen geparameterizeerde typen in zitten uiteraard).

Het mechanisme wat Java Generics gebruikt is overigens geen template mechanisme, dit lost een aantal vervelende problemen met de C++ tegenhanger op :) .

In ieder geval is het erg leuk om eens naar het prototype te kijken. Het is werkelijk een genot om ermee te werken :) . De gecompileerde code werkt in alle VMs.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Ik had 1.4.0 net naar beneden gehaald, evenals de generics patch.

Zal me eens gaan verdiepen in die generics, vin'k interessante kost. ( Mede dankzij jouw parser code van een tijdje terug :) )

Als je geregeld C(++) progt, is het af en toe een verademing om met Java te stoeien.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
farlane: Ik had 1.4.0 net naar beneden gehaald, evenals de generics patch.
Leuk :)
Compileren met de generics compiler vereist wel ff wat instellingen, maar als het eenmaal goed staat werkt het perfect. Zelf heb ik het voor elkaar gekregen om Ant zo te configureren dat hij de generics compiler gebruikt. Misschien is dit ook wel handig voor anderen (kan wel ff posten hoe dat moet als er interesse is). Je kan Ant ook heel gemakkelijk gebruiken om gewoon ff iets te compileren en de zaakjes gelijk netjes te configureren :) . Voor Ant, zie m'n signature ;) (edit: oh nee, die link paste niet meer...)
Zal me eens gaan verdiepen in die generics, vin'k interessante kost.
Ik ook :) . Helaas zijn er wel wat hele kleine vervelende punten bij het toepassen van geparameterizeerde typen, maar dat ligt niet zozeer aan deze implementatie.
Mede dankzij jouw parser code van een tijdje terug :)
hehe :) dat was idd wel leuk. Helaas heb ik te weinig tijd om het ook serieus af te ronden. Het zou wel leuk zijn om een volledige bib van parser combinators te bouwen + een parser generator die de combinators gebruikt + semantische functies :9~ .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Op dinsdag 16 oktober 2001 21:52 schreef mbravenboer het volgende:

[..]

Leuk :)
Compileren met de generics compiler vereist wel ff wat instellingen, [..]
Wat zijn generics?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Scorpion: Wat zijn generics?
Generics, geparameterizeerde typen en methoden, kan je gebruiken om generiek(er) te programmeren en daarbij vaak veel casts te voorkomen...

Klassen kunnen geparameterizeerd worden met types.

Envoudig voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Pair<F, S>
{
    private F _first;
    private S _second;

    public Pair(F first, S second)
    {
        super();
        _first  = first;
        _second = second;
    }

    public F getFirst()
    {
        return _first;
    }

    public S getSecond()
    {
        return _second;
    }
}

...

Pair<String, Calendar> pair = new Pair<String, Calendar>(..);
String first = pair.getFirst();
String second = pair.getSecond();

...

List<String> list = new ArrayList<String>();
list.add("bla");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
{
     String bla = iterator.next();
}

Uiteraard biedt het nog veel meer mogelijkheden, maar dit moet wel een beetje een indruk geven :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Op woensdag 17 oktober 2001 08:56 schreef mbravenboer het volgende:

[..]

Uiteraard biedt het nog veel meer mogelijkheden, maar dit moet wel een beetje een indruk geven :)
Ok duidelijk, maar is dit inderdaad handig om te gebruiken met programmeren? Of blijkt het in de praktijk toch niet veel gebruikt?

  • Jrz
  • Registratie: Mei 2000
  • Laatst online: 02:58

Jrz

––––––––––––

Haha, Scorpion hier...
hehe
emm, generics zijn gewoon (eindelijk!) templates...

Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Jrz/Scorpion: emm, generics zijn gewoon (eindelijk!) templates...
Mwah ongeveer ;) . Ik had er hier: [topic=197726/2/25] ook al iets over gezegd, maar het komt er op neer dat je inderdaad dezelfde effecten kan bereiken. De implementatie en het model is echter wel behoorlijk anders...

Ik denk zeker dat het in de praktijk gebruikt zal gaan worden. Sowieso is het voor de Collections natuurlijk erg makkelijk en heeft het ook een grote documenterende waarde. Vaak moet je uit de javadoc tekst opmaken wat in er in een collectie zit.

Ik denk dat mensen het minder zelf zullen gebruiken (dus zelf geparameterizeerde klassen gaan definieren), maar het is echt erg eenvoudig en goed te gebruiken. Ik kom vrij veel situaties tegen waarin je problemen fraai generiek op zou kunnen lossen, maar ik dit toch niet doe voor duidelijkheid, type-safety en om bergen obscure casts te voorkomen. In al deze situaties zijn geparameterizeerde typen een uitkomst.

Tegelijk met de generics zijn ook covariante return-typen opgenomen (zie ook Microsoft J# beta1). Dit lijkt een minimale aanpassingen, maar biedt zeer interessante mogelijkheden...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Op woensdag 17 oktober 2001 09:52 schreef Jrz het volgende:
Haha, Scorpion hier...
euhm.. ?? :?

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Op woensdag 17 oktober 2001 10:06 schreef mbravenboer het volgende:

[..]

Mwah ongeveer ;) . Ik had er hier: [topic=197726/2/25] ook al iets over gezegd, maar het komt er op neer dat je inderdaad dezelfde effecten kan bereiken. De implementatie en het model is echter wel behoorlijk anders...

Ik denk zeker dat het in de praktijk gebruikt zal gaan worden. Sowieso is het voor de Collections natuurlijk erg makkelijk en heeft het ook een grote documenterende waarde. Vaak moet je uit de javadoc tekst opmaken wat in er in een collectie zit.

Ik denk dat mensen het minder zelf zullen gebruiken (dus zelf geparameterizeerde klassen gaan definieren), maar het is echt erg eenvoudig en goed te gebruiken. Ik kom vrij veel situaties tegen waarin je problemen fraai generiek op zou kunnen lossen, maar ik dit toch niet doe voor duidelijkheid, type-safety en om bergen obscure casts te voorkomen. In al deze situaties zijn geparameterizeerde typen een uitkomst.

Tegelijk met de generics zijn ook covariante return-typen opgenomen (zie ook Microsoft J# beta1). Dit lijkt een minimale aanpassingen, maar biedt zeer interessante mogelijkheden...
Maar is een cast conversie dan niet slim? Wat er nu is werkt prima. Je slaat alles op in een collection framework, en cast alles van object naar je gewenste object.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Scorpion: Maar is een cast conversie dan niet slim? Wat er nu is werkt prima. Je slaat alles op in een collection framework, en cast alles van object naar je gewenste object.
Het punt is juist dat je dan precies nooit meer hoefte te casten :) . Je kunt gewoon een verzameling maken van object X en dit object eruit halen zonder te casten.

Dit is niet alleen makkelijk voor de programmeur, maar het is ook een duidelijke manier van documentatie. Als je verzamelingen publiek geschikbaar maakt kan je aangeven wat er in zit en er kan dus at compile time behoorlijk wat type controle plaatsvinden.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Ik merk dat je nog altijd geen primitieven in een collectie kunt gooien, dus het generics idee werkt inderdaad niet hetzelfde als de templates in C++, waar je mag zeggen
code:
1
std::vector<int> intvector;


code:
1
Vector<int> intvector = new Vector<int>();

Magdusniet. Jammer....maar hoe hebben ze die generics dan wel gebouwd?

[edit] met haakjes en puntkomma anders compiled ie niet :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
farlane: Ik merk dat je nog altijd geen primitieven in een collectie kunt gooien
Klopt, dat zou ook onlogisch zijn vanuit de scheiding die Java normaal gesproken maakt tussen objecten en primitieven.
maar hoe hebben ze die generics dan wel gebouwd?
Men heeft besloten dat het extreem belangrijk is dat de code ook in oudere VMs blijft werken en dus volledig compatible is. Daarom worden er op de benodigde plaatsen casts ingevoegd in de bytecode. Gelukkig wordt de code echter wel opgeleukd met attributen, waardoor VMs die kennis hebben van geparameterizeerde typen deze casts kunnen vermijden... Buitengewoon fraai is het niet, maar het is wel een goed compromis denk ik.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

templates lijken leuk maar geef mij maar gewoon casten.
als je eenmaal flink bezig gaat met templates dan ga je merken dat er heeeeel veel code wordt gegenereerd. voor iedere combinaties van types als het goed is een aparte class. tenminste, dat is wat ik van c++ programmeurs hoor.
"niet veel willen casten" lijkt me geen reden om templates te gebruiken. niet zo lui zeg.. gewoon sneller leren typen.
er zijn weldegelijk nuttige dingen om te doen met templates (template functies die voor jou casten bijvoorbeeld. ;)
code:
1
  public T dontwanttotype(Object o) { return (T) o; }

hierdoor zou de Object[] toArray(Object[] o) misschien soepeler kunnen gaan en ook de cast van rmi-object naar ejbhome zou eindelijk eens in 1 regel kunnen.

maar andermaal... meer code = meer compile tijd. en zo veel lost het niet op.

naja is laat... ik zal wel veel goede punten niet zien.
later

:Z

Verwijderd

Op woensdag 17 oktober 2001 08:56 schreef mbravenboer het volgende:

[..]

Generics, geparameterizeerde typen en methoden, kan je gebruiken om generiek(er) te programmeren en daarbij vaak veel casts te voorkomen...

Klassen kunnen geparameterizeerd worden met types.

Envoudig voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Pair<F, S>
{
    private F _first;
    private S _second;

    public Pair(F first, S second)
    {
        super();
        _first  = first;
        _second = second;
    }

    public F getFirst()
    {
        return _first;
    }

    public S getSecond()
    {
        return _second;
    }
}
bewijst dus niets.
je hoeft niet te casten.
maar zodra je dit object doorgeeft aan een andere functie
moet deze andere functie wel precies weten wat voor object dit is. (volgens mij)

dus als je deze pairs terug wilt geven doe je:
code:
1
2
3
  public Pair<String, Calendar>  afunction() {
     return new Pair<String, Calendar>("", acal);
  }

hoe is dit makkelijker? de rest van je applicatie moet nu
ook ineens weten dat een string en een pair aan elkaar vast zitten.

de aanroeper van "afunction()" zal dus moeten schrijven:
code:
1
2
3
  {
    Pair<String, Calendar> apair = afunction();
  }

en zo maar verder. je hele applicatie weet ineens dat jij een pair van String en Calendar gebruikt.

als ze beiden van type Object waren geweest dan hadden
al die types niet door hoeven filteren op plaatsen waar ze waarschijnlijk helemaal niet nodig waren geweest.

jullie doen alsof casten zoiets naars is. het scheelt je juist een hoop geklooi. als je die "afunction" aan wilt roepen en je bent alleen geinteresseerd in "Pair" en niet in "String" of "Calendar".. dan ben je met templates flink genaaid.

... goed.. einde rant... verbergen van types (en daarbij het "moeten" casten... is juist handig, en niet erg. als je het daarmee niet eens bent, hoor ik graag goede argumenten. ;) )

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
joeblade: templates lijken leuk maar geef mij maar gewoon casten. als je eenmaal flink bezig gaat met templates dan ga je merken dat er heeeeel veel code wordt gegenereerd. voor iedere combinaties van types als het goed is een aparte class. tenminste, dat is wat ik van c++ programmeurs hoor.
Nogmaals: zo zijn geparameterizeerde typen dus niet geimplementeerd in Java. Volgens mij was dat al vrij duidelijk eerder uitgelegd..
"niet veel willen casten" lijkt me geen reden om templates te gebruiken. niet zo lui zeg.. gewoon sneller leren typen.
Als je een geparameterizeerde klasse gebruikt kan de compiler je code controleren op type-correctheid. Bij een niet geparameterizeerde klasse en een cast is dat niet mogelijk en kan je at-runtime een fout tegen komen. Het is dus zeker niet alleen een kwestie van typen.
er zijn weldegelijk nuttige dingen om te doen met templates
Het gebruik in verzameling van geparameterizeerde typen is ook slechts een eenvoudig voorbeeld. Er zijn ook voorbeelden (pas nog wat geimplementeerd) die je niet generiek kunt oplossen zonder op hele vervelende plekken casts te moeten schrijven. Hierdoor wordt de betekenis van methoden onduidelijk.
maar andermaal... meer code = meer compile tijd. en zo veel lost het niet op.
Voor templates zou dit een argument zijn... Voor geparameterizeerde typen niet...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
joeblade: bewijst dus niets.
Probeer ik iets te bewijzen dan :? Ik geef een voorbeeld van het gebruik van geparameterizeerde typen...
maar zodra je dit object doorgeeft aan een andere functie
moet deze andere functie wel precies weten wat voor object dit is. (volgens mij)
Nee, je kan generieke functies definieren over een geparameterizeerd type waarbij het helemaal niet nodig is om het type van de elementen te weten. Sterker nog: dit is juist de kern van het systeem.

Ik geef even een ingewikkeld voorbeeld, waarin het goed tot zijn recht komt, maar het kan ook wel met simpelere voorbeelden worden gedaan.

Stel dat ik een lijst heb met paren van integers, strings en ik wil alle eerste elementen van die paren hebben. Dat kan uiteraard met een functionele aanpak via map fst.

Dergelijke zaken kan je nu zonder extreem veel casts volledig type safe implementeren in Java. Dit betekent dus dat de compiler de type-correctheid van je applicatie kan controleren en dat is (vind ik) erg belangrijk.

Ut voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Map<A, B> implements Function<List<A>, List<B>>
{
    private Function<A, B> _function;

    public Map(Function<A, B> function)
    {
        super();
        _function = function;
    }

    public List<B> apply(List<A> argument)
    {
        List<B> result = new ArrayList<B>();

        Iterator<A> iterator = argument.iterator();
        while(iterator.hasNext())
        {
            B element = function.apply(iterator.next());
            result.add(element)
        }

        return result;
    }
}

public class First<A, B> implements Function<Pair<A,B>, A>
{
    public A apply(Pair<A, B> pair)
    {
        return pair.getFirst();
    }
}

Zowel de functie Map als de functie First zijn nu volledig generiek en te controleren op type correctheid (in Java kan dit dus gecompileerd worden. Het dient niet als template).
hoe is dit makkelijker? de rest van je applicatie moet nu ook ineens weten dat een string en een pair aan elkaar vast zitten.
Nee dat is niet helemaal zo. Inderdaad moet je wel initieel opgeven op welke typen je wilt parameterizeren, maar alle andere functionaliteit kan je generiek gebruiken. Geen enkel punt.
als ze beiden van type Object waren geweest dan hadden al die types niet door hoeven filteren op plaatsen waar ze waarschijnlijk helemaal niet nodig waren geweest.
Types doorfilteren? Als het objecten waren geweest had de compiler veel minder kunnen controleren. Casts zijn niet te checken op type correctheid en moeten dus vermeden worden... Dergelijke constructies zorgen voor bugs en lastig debuggen...
jullie doen alsof casten zoiets naars is. het scheelt je juist een hoop geklooi. als je die "afunction" aan wilt roepen en je bent alleen geinteresseerd in "Pair" en niet in "String" of "Calendar".. dan ben je met templates flink genaaid.
Bij geparameterizeerde typen hoef je niet percee te parameterizeren. Je kan ook geen parameters opnemen. Mooi he? ;)
verbergen van types (en daarbij het "moeten" casten... is juist handig, en niet erg. als je het daarmee niet eens bent, hoor ik graag goede argumenten. ;) )
Verbergen van types is handig :? :?

Nadelen van jouw oplossing:
1. Geen type-safety
2. Geen compiler checks
3. Performance verlies door casts
4. De code is niet zelf-documenterend.

Al deze voordelen heb je wel bij geparameterizeerde typen...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Op vrijdag 19 oktober 2001 00:43 schreef joeblade ondermeer het volgende:

...dat er heeeeel veel code wordt gegenereerd...
... meer code = meer compile tijd. en zo veel lost het niet op...
Op het moment dat compile tijd en de hoeveelheid gegenereerde code een probleem gaat opleveren, is het project wel van een dergelijk formaat dat generics meer problemen oplossen dan dat ze veroorzaken.

Overigens is casten op plekken waar het eigenlijk niet (helemaal) correct is, een van de grootste veroorzakers van bugs. (En een van de moeilijkste om te vinden).

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1