- Leren
- Informatica & ICT
- Programmeren
- Java programmeren: klassen, overerving, collecties en streams
- Lijsten, arrays en strings in Java
Lijsten, arrays en strings in Java
BeginnerLes 4 van 11 in Cursus Java programmeren: klassen, overerving, collecties en streams
Wat je leert
- Maak ArrayLists, voeg elementen toe, lees, vervang en verwijder ze, controleer wat een lijst bevat en begrijp wat er gebeurt als een lijst wordt gedeeld of aan een methode wordt doorgegeven.
- Maak een lijst en benader elementen via hun indexImporteer en maak een ArrayList, voeg elementen toe, lees en vervang ze via hun index en blijf binnen het geldige indexbereik.
- Verwijder elementen en controleer wat een lijst bevatVerwijder elementen op index of op waarde, zoek waarden met contains en indexOf en vermijd de valkuilen van Integer-lijsten en verschuivende indexen.
- Deel lijsten tussen variabelen en methodenLeg uit wat een lijstvariabele bevat, wat er gebeurt als een lijst wordt toegewezen of aan een methode wordt doorgegeven, hoe je een lijst kopieert en hoe je twee lijsten vergelijkt.
- Maak een lijst en benader elementen via hun index
- Maak arrays, lees en schrijf hun elementen, geef arrays correct door en kopieer ze, en kies tussen een array en een ArrayList.
- Maak arrays en benader hun elementenDeclareer en maak arrays, vul ze, lees en schrijf elementen via hun index en weet wat hun lengte en standaardwaarden zijn en hoe je ze afdrukt.
- Geef arrays door, kopieer en vergelijk die, en kies tussen arrays en lijstenLeg arrayreferenties uit, kopieer en vergelijk arrays correct, verwissel elementen en bepaal wanneer een array of een ArrayList bij de taak past.
- Maak arrays en benader hun elementen
- Bezoek elk element met lussen met index en for-each-lussen, bereken totalen, gemiddelden en extrema, zoek waarden en wijzig een lijst veilig terwijl je die doorloopt.
- Doorloop lijsten en arrays met for en for-eachSchrijf lussen met index en for-each-lussen over lijsten, arrays en de tekens van een string en kies de juiste lus voor de taak.
- Bereken totalen, gemiddelden, aantallen en extremaGebruik accumulatorvariabelen om sommen, gemiddelden, aantallen, maxima en minima te berekenen en bouw een gefilterde lijst op.
- Zoek een waarde in een lijst of arraySchrijf lineaire zoekacties die een positie, een ja-of-neeantwoord of alle overeenkomsten teruggeven en zoek op een voorwaarde in plaats van op een exacte waarde.
- Wijzig een lijst veilig terwijl je die doorlooptVerwijder of voeg elementen toe tijdens een lus zonder elementen over te slaan of een exceptie te veroorzaken en kies daarvoor een veilige manier.
- Doorloop lijsten en arrays met for en for-each
- Behandel een string als een reeks tekens, zoek delen en haal ze eruit, schoon de string op en zet tekstregels om in gegevens en omgekeerd.
- Lees de tekens van een stringGebruik length en charAt, doorloop tekens, werk met char-waarden, voeg tekst samen met + en begrijp dat strings niet kunnen veranderen.
- Zoek delen van een string, haal die eruit en schoon die opZoek tekst met indexOf en contains, haal delen eruit met substring en wijzig hoofdletters, spaties en inhoud met replace, trim en verwante methoden.
- Splits tekst in delen en zet tekst om naar getallenSplits een regel met split in velden, zet velden om naar getallen en getallen naar tekst, controleer de delen en voeg ze weer samen.
- Lees de tekens van een string
- Vergelijk strings op inhoud en op alfabetische volgorde en gebruik StringBuilder om tekst stap voor stap op te bouwen en te bewerken.
- Vergelijk strings met equals en compareToGebruik equals en equalsIgnoreCase om de inhoud te testen, vermijd de valkuil van == en fouten door null en gebruik compareTo om strings te ordenen.
- Bouw en bewerk tekst met StringBuilderGebruik StringBuilder om tekst in een lus op te bouwen en ter plaatse te bewerken, zet het resultaat om naar een String en vermijd veelgemaakte fouten met StringBuilder.
- Vergelijk strings met equals en compareTo
Lijsten, arrays en strings in Java: uitleg
1Sla gegevens op in een ArrayList en beheer die
Een ArrayList bewaart verwante waarden in één geordende collectie, ook als je het uiteindelijke aantal niet kent. Werk van het maken van een lijst met een type naar het invoegen, vervangen, verwijderen en vinden van elementen op index of waarde. Volg daarna wat er gebeurt als twee variabelen of een methode die lijst delen, zodat je kunt kiezen tussen bestaande gegevens wijzigen en een afzonderlijk resultaat maken.
1.1 Maak en bewerk een ArrayList
Een ArrayList bewaart waarden op volgorde. De lijst groeit als je een element toevoegt en krimpt als je er een verwijdert. Elk element heeft een index, die begint bij 0. Importeer de klasse voordat je die gebruikt: import java.util.ArrayList;.
Maak een lijst met een type
ArrayList<String> drinks = new ArrayList<>();
drinks.add("tea");
drinks.add("milk");
Het type in <String> geeft aan wat de lijst opslaat. Met de diamantoperator <> rechts kan Java hetzelfde type afleiden. De lijst begint leeg, met grootte 0; na deze twee aanroepen bevat die [tea, milk] en heeft die grootte 2. Als je de lijst direct afdrukt, zie je de elementen: System.out.println(drinks);.
Het elementtype van een lijst moet een klassetype zijn. Gebruik voor getallen een wrapperklasse: Integer voor int, Double voor double, Boolean voor boolean of Character voor char. ArrayList<int> compileert niet. Met ArrayList<Integer> numbers = new ArrayList<>(); werkt numbers.add(5) omdat Java de int via autoboxing omzet naar een Integer. Als je de waarde leest met int n = numbers.get(0);, past Java unboxing toe.
Volg elke indexwijziging
String old = drinks.set(0, "coffee");
drinks.add(1, "water");
String last = drinks.get(2);
set(0, "coffee") vervangt het eerste element en geeft de oude waarde terug, dus old is "tea". De grootte blijft 2. Als je "water" op index 1 invoegt, schuift "milk" naar rechts. De lijst is nu [coffee, water, milk]; last is "milk" en de grootte is 3.
| Taak | Aanroep | Geldige index |
|---|---|---|
| Een element lezen | get(i) | 0 tot en met size() - 1 |
| Een element vervangen | set(i, value) | 0 tot en met size() - 1 |
| Een element invoegen | add(i, value) | 0 tot en met size() |
| Een element achteraan toevoegen | add(value) | Geen index nodig |
De extra toegestane invoegindex is de positie direct na het huidige laatste element. Bij deze lijst voegt add(3, "juice") achteraan toe, maar get(3) zou vóór die invoeging falen. Een ongeldige index veroorzaakt een IndexOutOfBoundsException. Gebruik get(size() - 1) voor het laatste element, nadat je hebt gecontroleerd dat de lijst niet leeg is.
Begin met gegevens of verzamel invoer
Met import java.util.List; maakt new ArrayList<>(List.of("red", "green", "blue")) een wijzigbare lijst met die waarden. List.of(...) alleen maakt een niet-wijzigbare lijst: add, set en remove werpen een UnsupportedOperationException op. Je zult ook List<String> names = new ArrayList<>(); zien; de algemene List-variabele ondersteunt deze lijstmethoden nog steeds.
Gebruik een Scanner met de naam scanner en een lege lijst met de naam lines om regels te verzamelen tot aan een lege regel:
while (true) {
String line = scanner.nextLine();
if (line.isEmpty()) {
break;
}
lines.add(line);
}
De stopregel wordt vóór het toevoegen gecontroleerd en dus niet opgeslagen. lines.size() telt de opgeslagen regels. lines.isEmpty() test of er geen zijn en lines.clear() verwijdert ze allemaal wanneer je de lijst opnieuw wilt gebruiken.
Belangrijkste punten
- Indexen beginnen bij 0; het laatste element staat op
size() - 1. setvervangt;addmet een index voegt in en verschuift latere elementen.- Gebruik wrappertypen zoals
Integerin een ArrayList. - Kopieer
List.of(...)naar een ArrayList als de lijst moet kunnen veranderen. clear()verwijdert alle elementen; een lege lijst heeft grootte 0.
1.2 Verwijder waarden en vind hun posities
Als je een element verwijdert, veranderen zowel de grootte als de indexen van latere elementen. Een zoekactie vertelt je of een waarde bestaat of waar die nu staat. Houd het verschil tussen een waarde en de positie ervan duidelijk, vooral in een lijst met gehele getallen.
Twee betekenissen van remove
| Aanroep | Betekenis | Teruggegeven resultaat |
|---|---|---|
remove(int index) | Verwijder het element op een positie | Het verwijderde element |
remove(Object value) | Verwijder de eerste gelijke waarde | true indien verwijderd; anders false |
Bij [coffee, water, milk] geeft remove(0) de waarde "coffee" terug en blijft [water, milk] over. De oude index 2 voor "milk" is nu ongeldig; die waarde is naar index 1 verschoven. Een opgeslagen index is alleen bruikbaar zolang bewerkingen de posities die de index aanduidt niet hebben veranderd.
Verwijderen op waarde betekent niet dat alle overeenkomsten worden verwijderd. Als je begint met [a, b, a], laat remove("a") de lijst [b, a] over. Een tweede aanroep verwijdert de resterende "a". Een ontbrekende waarde verwijderen geeft false terug en laat de lijst ongewijzigd, zodat je het resultaat direct kunt gebruiken:
boolean removed = names.remove("Lena");
if (removed) {
System.out.println("Name removed");
}
De valkuil van de methodevarianten bij gehele getallen
Een int-argument selecteert de vorm met een index, ook als de lijst gehele getallen bevat:
ArrayList<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));
int removed = numbers.remove(1);
boolean found = numbers.remove(Integer.valueOf(10));
De eerste aanroep verwijdert het element op index 1, dus removed is 20 en de lijst wordt [10, 30]. De tweede aanroep geeft expliciet een Integer-object mee. Die verwijdert de waarde 10, maakt found waar en laat [30] over. Een aanroep van remove(10) op de oorspronkelijke lijst met drie elementen zou index 10 proberen en een IndexOutOfBoundsException opwerpen.
Kies een zoekresultaat
Voor colors = [red, green, blue, green] is contains("green") gelijk aan true, indexOf("green") aan 1 en lastIndexOf("green") aan 3. contains geeft een ja-of-neeantwoord. De twee indexmethoden geven de eerste of laatste positie die overeenkomt. Een ontbrekende waarde levert respectievelijk false of -1 op.
Deze methoden gebruiken equals om elementen te vergelijken. De inhoud van strings moet exact overeenkomen, inclusief hoofdletters en kleine letters: indexOf("Green") is -1 voor deze lijst. Voor een hoofdletterongevoelige zoekactie kan een lus elke naam vergelijken met equalsIgnoreCase.
Een overeenkomst op index 0 is ook een overeenkomst. Met de test indexOf(x) > 0 mis je die. Als je de positie nodig hebt, test dan expliciet op de waarde die aangeeft dat er niets is gevonden:
int index = colors.indexOf("red");
if (index != -1) {
colors.remove(index);
}
Hier geeft de zoekactie 0 terug, slaagt de test en blijft na verwijdering op index 0 de lijst [green, blue, green] over. Controleer vóór het toevoegen om dubbele namen te voorkomen: if (!names.contains(name)) { names.add(name); }. Om alle voorkomens te verwijderen, kun je de verwijdering herhalen zolang contains waar is of een veilige achterwaartse lus gebruiken. Een voorwaartse lus die na een verwijdering altijd de index verhoogt, kan een verschoven element overslaan.
Belangrijkste punten
remove(index)geeft een element terug;remove(value)geeft een booleaanse waarde terug.- Gebruik voor een gehele waarde
remove(Integer.valueOf(x)). - Bij verwijdering schuiven latere elementen één positie naar links.
indexOfenlastIndexOfgeven -1 terug voor een ontbrekende waarde; 0 betekent gevonden.- Zoekacties in strings zijn hoofdlettergevoelig en vergelijken de inhoud.
- Verwijderen op waarde verwijdert alleen de eerste overeenkomst.
1.3 Begrijp gedeelde lijsten en kopieën
Een lijstvariabele bevat een referentie naar een object. De variabele zelf bevat niet alle elementen. Dit verklaart waarom een lijst wijzigen via de ene naam invloed kan hebben op een andere naam en waarom een parameter een waarde toewijzen een ander effect heeft dan de elementen bewerken.
Volg de referenties
ArrayList<String> original = new ArrayList<>(List.of("tea"));
ArrayList<String> alias = original;
ArrayList<String> copy = new ArrayList<>(original);
alias.add("milk");
copy.add("juice");
original en alias verwijzen naar één lijst. Na de toevoeging via alias tonen beide [tea, milk]. De kopie is een afzonderlijke lijst, die vóór die toevoeging is gemaakt, en bevat dus [tea, juice]. Twee namen voor één object heten aliassen. Een toewijzing kopieert een referentie; de kopieerconstructor maakt een nieuwe lijst en kopieert de elementen daarin.
De gekopieerde lijst bevat referenties naar dezelfde elementobjecten. Bij strings en wrapperwaarden kunnen die elementobjecten niet veranderen, dus als je een plaats in de ene lijst vervangt, verandert de plaats in de andere lijst niet. Een lijst kopiëren is voldoende om deze twee lijsten onafhankelijk te laten toevoegen, verwijderen en vervangen.
Een methode krijgt een kopie van de referentie
Java geeft argumenten door op waarde. Voor een lijst is die waarde een referentie. De variabele van de aanroeper en de parameter verwijzen aanvankelijk naar dezelfde lijst:
static void addBonus(ArrayList<Integer> scores, int bonus) {
for (int i = 0; i < scores.size(); i++) {
scores.set(i, scores.get(i) + bonus);
}
}
Als je addBonus(scores, 5) aanroept op [70, 85], verandert de lijst van de aanroeper in [75, 90]. De methode hoeft geen lijst terug te geven omdat die het gedeelde object bewerkt. Maar als je binnen de methode scores = new ArrayList<>(); toewijst, laat je alleen de lokale parameter naar een andere lijst verwijzen. De variabele van de aanroeper verwijst nog steeds naar de oude lijst.
Een int-parameter ontvangt een gekopieerd getal. Als je die parameter wijzigt, kan de int-variabele van de aanroeper niet veranderen. In beide gevallen is de parameter lokaal; het verschil is of de waarde ervan naar een gedeeld veranderlijk object leidt.
Geef nieuwe gegevens terug als dat de taak is
static ArrayList<String> longWords(ArrayList<String> words, int minLength) {
ArrayList<String> result = new ArrayList<>();
for (String word : words) {
if (word.length() >= minLength) {
result.add(word);
}
}
return result;
}
De methode leest words en schrijft alleen naar result, dus de invoer blijft ongewijzigd. Een methode die een argument wijzigt, moet dat gedrag duidelijk maken, zoals addBonus doet. Een methode die nieuwe gegevens teruggeeft, maakt het gemakkelijker om de uitvoer afzonderlijk van de invoer te controleren.
Vergelijk inhoud en handel ontbrekende resultaten af
a == b test of twee lijstreferenties naar hetzelfde object verwijzen. a.equals(b) test of de lijsten even groot zijn en gelijke elementen in dezelfde volgorde hebben. Twee afzonderlijk opgebouwde lijsten [1, 2] hebben gelijke inhoud maar een verschillende identiteit; [2, 1] heeft geen gelijke inhoud in de volgorde van de lijst.
Een lege lijst is een echt object met grootte 0. Een lus daarover wordt nul keer uitgevoerd, maar get(0) faalt omdat er geen elementindexen zijn. null betekent dat er geen lijstobject is; zelfs size() werpt dan een NullPointerException op. Een methode zonder overeenkomsten kan een lege resultatenlijst teruggeven, zodat de aanroeper het resultaat normaal kan doorlopen.
Belangrijkste punten
- Door toewijzing wordt een lijst gedeeld;
new ArrayList<>(original)maakt een afzonderlijke lijst. - Een methode kan de lijst van de aanroeper bewerken via een gekopieerde referentie.
- Een parameter opnieuw toewijzen laat de variabele van de aanroeper niet naar een andere lijst verwijzen.
equalsbij lijsten vergelijkt de inhoud in volgorde;==vergelijkt identiteit.- Een lege lijst kun je doorlopen;
nullverwijst naar geen enkele lijst.
2Sla gegevens met een vast aantal elementen op in arrays
Arrays geven elke waarde een genummerde plaats in een structuur waarvan de lengte vast blijft. Maak en vul die plaatsen, lees hun standaardwaarden en druk hun inhoud duidelijk af. Voor arrays kopiëren, vergelijken, verwisselen en aan methoden doorgeven moet je begrijpen welke variabelen naar hetzelfde object verwijzen. Gebruik deze ideeën om voor een bepaalde taak een array of een ArrayList te kiezen.
2.1 Maak arrays met vaste plaatsen
Een array bewaart een vast aantal elementen van één type. Je kiest de lengte wanneer je de array maakt. Elementen kunnen veranderen, maar het aantal plaatsen in die array niet. Arrays kunnen primitieve waarden direct opslaan.
Maak en vul plaatsen
int[] scores = new int[5];
scores[0] = 90;
int first = scores[0];
int[] primes = {2, 3, 5, 7, 11};
new int[5] maakt vijf plaatsen. Hun indexen zijn 0, 1, 2, 3 en 4. Met vierkante haken lees en schrijf je een plaats, dus first wordt 90. De initialisator voor primes maakt en vult vijf plaatsen. Wanneer je een gevulde array als expressie nodig hebt, bijvoorbeeld als methodeargument, gebruik je new int[] {2, 3, 5}.
De lengte is een veld: scores.length, zonder haakjes. Het telt alle plaatsen, ook de plaatsen waaraan je zelf nog geen waarde hebt toegewezen. Als je een waarde op plaats 0 zet, verandert de lengte niet van 5 in 1.
| Structuur | Aantal elementen | Een element lezen |
|---|---|---|
| Array | a.length | a[i] |
| ArrayList | a.size() | a.get(i) |
| String | s.length() | s.charAt(i) |
Deze namen zijn niet onderling uitwisselbaar. Een array heeft geen methode size() en een string heeft haakjes nodig na length.
Ken de beginwaarden
Nieuwe plaatsen in een array krijgen standaardwaarden. Numerieke primitieve arrays beginnen met nul: 0 voor int, 0,0 voor double. Een boolean[] begint met false; een char[] begint met het teken waarvan de code nul is, geschreven als '\u0000'. Arrays van klassetypen, waaronder String[], beginnen met null-referenties.
String[] words = new String[3];
words[0] = "sun";
System.out.println(words[0].length());
Dit drukt 3 af omdat plaats 0 nu naar "sun" verwijst. Plaatsen 1 en 2 bevatten nog steeds null. De aanroep words[1].length() werpt een NullPointerException op: er staat daar nog geen string. Een plaats met de standaardwaarde null is iets anders dan een lege string "", een object met lengte 0.
Lees uitvoer en blijf binnen de array
Importeer java.util.Arrays en gebruik System.out.println(Arrays.toString(scores)); om [90, 0, 0, 0, 0] af te drukken. Als je scores direct afdrukt, zie je een type- en identiteitscode zoals [I@1b6d3586, niet de elementen. De identiteitscode geeft geen bruikbaar overzicht van de opgeslagen getallen.
Voor één week met temperaturen in graden Celsius:
double[] temps = {12.5, 14.0, 9.5, 11.0, 15.5, 13.0, 10.5};
temps[2] = 10.0;
De meting van de derde dag verandert van 9,5 in 10,0. De eerste meting is temps[0]; de laatste is temps[6], of temps[temps.length - 1]. temps[7] ligt buiten de array. Java werpt een ArrayIndexOutOfBoundsException op bij een ongeldige arrayindex. Gebruik in een lus met index i < temps.length: i <= temps.length probeert één extra plaats na de laatste geldige plaats. Een array met lengte nul heeft helemaal geen geldige elementindexen.
Belangrijkste punten
- De lengte van een array ligt vast wanneer de array wordt gemaakt.
- Gebruik
a[i]om een plaats te lezen of te schrijven ena.lengthom plaatsen te tellen. - Nieuwe numerieke plaatsen bevatten nul; nieuwe String-plaatsen bevatten
null. Arrays.toString(a)drukt de inhoud af.- De laatste geldige index is
a.length - 1.
2.2 Kopieer en vergelijk arrays en verwissel elementen
Een arrayvariabele bevat een referentie, net als een lijstvariabele. Als je die referentie toewijst, maak je een andere naam voor dezelfde array. Voor een afzonderlijke kopie is een nieuw arrayobject nodig en om de inhoud te vergelijken is een methode nodig die de plaatsen controleert.
Toewijzen en kopiëren
int[] a = {4, 9, 2};
int[] alias = a;
int[] copy = Arrays.copyOf(a, a.length);
alias[0] = 99;
Nu tonen a en alias allebei [99, 9, 2]; copy toont nog steeds [4, 9, 2]. Arrays.copyOf(a, a.length) maakt een nieuwe array met dezelfde lengte. Ook met a.clone() kun je de array kopiëren. Importeer java.util.Arrays voor de hulpmethoden.
Een andere gevraagde lengte verandert de nieuwe array, niet de oude. Arrays.copyOf(new int[] {2, 3, 5}, 4) levert [2, 3, 5, 0] op. Extra plaatsen krijgen standaardwaarden. Om een variabele naar een grotere array te laten verwijzen, wijs je de teruggegeven kopie aan die variabele toe. Een alias van het origineel verwijst nog steeds naar de oude array.
Methodeaanroepen delen het object
static void doubleAll(int[] values) {
for (int i = 0; i < values.length; i++) {
values[i] = values[i] * 2;
}
}
De parameter ontvangt een kopie van de referentie. De methode verandert daardoor de plaatsen in de array van de aanroeper. Als je values opnieuw aan een nieuwe array zou toewijzen, zou alleen de parameter veranderen. Een methode kan ook een nieuwe array teruggeven: return new int[] {values[0], values[values.length - 1]}; levert [4, 2] op voor invoer {4, 9, 2}. Die expressie vereist niet-lege invoer omdat die twee indexen leest.
Inhoudelijke gelijkheid werkt anders bij arrays
Voor afzonderlijk gemaakte arrays a = {1, 2} en b = {1, 2} zijn zowel a == b als a.equals(b) onwaar: equals bij arrays controleert identiteit. Arrays.equals(a, b) is waar omdat de overeenkomstige elementen gelijk zijn. Dit verschilt van een ArrayList, waarvan equals de inhoud in volgorde vergelijkt.
Bewaar een waarde voordat je die overschrijft
Om twee posities te verwisselen, bewaar je één oude waarde in een tijdelijke variabele:
int temp = a[0];
a[0] = a[2];
a[2] = temp;
Als je begint met {4, 9, 2}, bewaart de eerste regel 4. De tweede levert [2, 9, 2] op. De derde zet de opgeslagen 4 terug op index 2 en voltooit zo [2, 9, 4]. Zonder temp zou de toewijzing a[2] = a[0] na de tweede regel opnieuw 2 kopiëren en zou de oorspronkelijke 4 verloren gaan.
Kies een structuur die bij de gegevens past
| Behoefte | Geschikte keuze |
|---|---|
| Een vaste plaats voor elke dag of maand | Array |
| Primitieve waarden zonder wrappers | Array |
| Elementen toevoegen of verwijderen zodra invoer binnenkomt | ArrayList |
Arrays komen ook voor in main(String[] args) en als resultaat van String.split. Voor een String[] words maakt new ArrayList<>(Arrays.asList(words)) een lijst die kan groeien. Maak voor een int[] een ArrayList<Integer> en voeg elk geheel getal toe in een lus. Arrays.asList behandelt de volledige primitieve array als één element en maakt dus geen lijst van de afzonderlijke getallen.
Belangrijkste punten
- Een array toewijzen deelt hetzelfde object;
copyOfofclonemaakt een kopie. - Gebruik
Arrays.equalsvoor de inhoud van arrays. - Een methode kan via haar parameter gedeelde plaatsen in een array wijzigen.
- Een tijdelijke variabele bewaart een waarde tijdens het verwisselen.
- Gebruik arrays voor vaste plaatsen en ArrayLists voor veranderlijke aantallen.
- Zet een primitieve array met een lus om naar een lijst met wrappers.
3Verwerk lijsten en arrays met lussen
Lussen zetten opgeslagen waarden om in bruikbare resultaten: een totaal, een aantal, een extremum, een gefilterde collectie of een zoekresultaat. Kies hoe je elementen bezoekt op basis van de vraag of je waarden of posities nodig hebt. Volg hoe de toestand van elke lus verandert om lege gegevens af te handelen, het deel achter de komma bij gemiddelden te behouden, een zoekactie op tijd te stoppen en waarden te verwijderen zonder verschuivende elementen te missen.
3.1 Kies een lus met index of een for-each-lus
Met een lus kan één stuk code elk element verwerken. De keuze hangt af van wat de lusbody nodig heeft: alleen een waarde, de positie ervan of een manier om naar de collectie terug te schrijven. Zowel arrays als ArrayLists ondersteunen lussen met index en for-each-lussen.
Bezoek waarden op volgorde
for (String task : tasks) {
System.out.println(task);
}
Lees dit als “voor elke taak in tasks”. Bij [shop, cook, clean] drukt de lus de drie strings in die volgorde af. De lusvariabele heeft het elementtype. Gebruik bij ArrayList<Integer> het type int om op elke waarde unboxing toe te passen of Integer om de wrapperreferentie te behouden. Voor tekens van een string bezoekt for (char c : word.toCharArray()) de char-waarden.
Een for-each-lus biedt geen index. Gebruik een lus met index als je genummerde regels nodig hebt:
for (int i = 0; i < tasks.size(); i++) {
System.out.println((i + 1) + ". " + tasks.get(i));
}
De index begint bij 0, maar het weergegeven regelnummer begint bij 1. Door de haakjes is i + 1 een optelling voordat het resultaat deel van de tekst wordt. Voor een array verander je de voorwaarde in i < tasks.length en lees je tasks[i]. Een while-lus kan hetzelfde doen door vóór de lus een teller te initialiseren en die in de lusbody te verhogen.
Schrijf terug via een positie
int[] nums = {4, 9, 2};
for (int n : nums) {
n = n * 2;
}
Dit laat de array ongewijzigd. Elke iteratie zet een kopie van één primitieve waarde in n; een waarde toewijzen aan die lokale variabele schrijft niet naar de oorspronkelijke plaats. Om de array te wijzigen:
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * 2;
}
Het resultaat is [8, 18, 4]. Voor een lijst met gehele getallen is de overeenkomstige bijwerking list.set(i, list.get(i) * 2). De index vertelt Java welk opgeslagen element moet worden vervangen.
Laat de grenzen bij de lusbody passen
Om een lijst achterwaarts te doorlopen, begin je bij tasks.size() - 1, ga je door zolang i >= 0 en gebruik je i--. Dit bezoekt achtereenvolgens clean, cook en shop. Om elk tweede element te nemen, kun je i += 2 in een voorwaartse lus gebruiken.
Vergelijkingen met een buur hebben een korter bereik nodig. Als de lusbody zowel list.get(i) als list.get(i + 1) leest, is de voorwaarde i < list.size() - 1. De laatste geldige beginpositie is het voorlaatste element. Met de gebruikelijke voorwaarde voor het volledig doorlopen zou de lus na het laatste element een niet-bestaande buur proberen te lezen.
Als je twee even lange lijsten samen verwerkt, gebruik je één index om beide te benaderen. Zo duiden names.get(i) en scores.get(i) de overeenkomstige elementen aan. Een for-each-lus is eenvoudiger als de positie geen rol speelt, bijvoorbeeld als je elke naam afdrukt of elke waarde bij een totaal optelt.
Als je bij 1 begint, sla je ongemerkt het eerste element over. Met <= size() of <= length probeer je één extra ongeldige index. Een lege lijst of array heeft geen speciale regel voor het doorlopen nodig: de beginvoorwaarde is onwaar, dus de lusbody wordt nul keer uitgevoerd. Latere code die door het aantal deelt of een element leest, moet het lege geval zelf afhandelen.
Belangrijkste punten
- For-each is handig als de lusbody alleen elke waarde nodig heeft.
- Gebruik een index om opgeslagen waarden te schrijven, posities bij te houden of buren te vergelijken.
- Een waarde toewijzen aan een for-each-variabele vervangt geen array- of lijstelement.
- Een buur benaderen op
i + 1vereisti < size() - 1. - Bij lege collecties wordt een gewone doorlooplus nul keer uitgevoerd.
3.2 Bereken een resultaat uit veel elementen
Een accumulator houdt een resultaat bij dat tijdens de iteraties van een lus wordt opgebouwd. Initialiseer de accumulator vóór de lus, werk die daarbinnen bij en gebruik die daarna. De beginwaarde hangt af van de taak: een som of telling begint bij 0, terwijl een maximum een werkelijk element nodig heeft.
Totalen en gemiddelden
int sum = 0;
for (int value : numbers) {
sum += value;
}
if (!numbers.isEmpty()) {
double average = (double) sum / numbers.size();
System.out.println(average);
}
Voor [4, 7, 8] verandert sum van 0 naar 4, dan 11 en dan 19. Beide operanden in sum / numbers.size() zouden gehele getallen zijn, wat 6 oplevert. Als je sum vóór de deling expliciet converteert, krijg je ongeveer 6,33. Als je het al berekende quotiënt converteert, zet je alleen de afgekaptе waarde 6 om in 6,0.
Een lege collectie heeft geen gewoon gemiddelde. Geheeltallige deling door nul werpt een ArithmeticException op; de zwevendekommagetallendeling 0.0 / 0 geeft NaN. Bepaal vóór het delen wat het lege geval voor het programma betekent, bijvoorbeeld de melding “Geen metingen” weergeven. Voor kommagetalafstanden [5.0, 7.5, 10.0] km is een double-totaal 22,5 km en het gemiddelde 7,5 km.
Tel alleen overeenkomsten
Een voorwaardelijke telling begint bij 0 en neemt alleen toe als de test slaagt. Voor temperaturen {22, 27, 31, 24, 26} graden Celsius levert if (t > 25) { count++; } de waarde 3 op. Zet de initialisatie buiten de lus; als je count bij elke iteratie opnieuw instelt, gaan eerdere overeenkomsten verloren.
Zoek een extremum en de positie ervan
Begin bij een niet-lege array met int max = values[0];. Vervang max telkens als een bezochte waarde groter is. Beginnen bij 0 gaat fout bij {-5, -2, -9}: het resultaat is dan 0, hoewel geen element die waarde heeft. Als je begint met -5, kan de lus het juiste maximum -2 vinden. Een minimum gebruikt hetzelfde patroon met <.
Als de positie ertoe doet, houd je de beste index bij:
int best = 0;
for (int i = 1; i < numbers.size(); i++) {
if (numbers.get(i) > numbers.get(best)) {
best = i;
}
}
Voor [4, 7, 8] eindigt best op 2 en is numbers.get(best) gelijk aan 8. De lus begint bij 1 omdat index 0 al de eerste kandidaat is. Met > vervangt een gelijke waarde de huidige kandidaat niet, zodat het eerste maximum behouden blijft. Met >= vervangt elke gelijke waarde de kandidaat, zodat het laatste maximum behouden blijft. Controleer of de collectie leeg is voordat je een kandidaat op index 0 kiest.
Verzamel overeenkomende waarden
Bij filteren gebruik je een lege resultatenlijst als accumulator. Bezoek elk woord, voeg het toe als word.length() > 4 en geef het resultaat terug. Voor [sun, planet, moon, galaxy] is het resultaat [planet, galaxy]. Als je de invoer leest en aan een afzonderlijke lijst toevoegt, blijft de invoer ongewijzigd.
Voor twee Integer-elementen vergelijkt == de objectidentiteit. Kleine waarden die worden hergebruikt kunnen deze fout verbergen; gelijke grotere waarden kunnen verschillende objecten zijn. Vergelijk met equals of pas eerst unboxing toe naar int-variabelen. De numerieke operatoren <, >, <= en >= passen unboxing toe op wrapperwaarden, dus de code voor de beste index vergelijkt hun getallen.
Belangrijkste punten
- Initialiseer een accumulator vóór de lus en werk die daarbinnen bij.
- Converteer vóór een geheeltallige deling om het deel achter de komma van een gemiddelde te behouden.
- Controleer of de collectie leeg is voordat je een gemiddelde of extremum bepaalt.
- Initialiseer een maximum of minimum met een werkelijk element.
>behoudt het eerste maximum;>=behoudt het laatste.- Bij filteren verzamel je overeenkomsten in een nieuwe lijst.
- Gebruik waardegelijkheid voor twee Integer-objecten.
3.3 Zoek tot een overeenkomst of het einde
Een lineaire zoekactie controleert elementen één voor één. Die werkt op gegevens in elke volgorde. Een succesvolle zoekactie naar de eerste overeenkomst kan vroeg stoppen; een zoekactie zonder resultaat moet het einde bereiken voordat vaststaat dat geen element overeenkomt.
Geef de eerste overeenkomende index terug
static int indexOfName(ArrayList<String> names, String target) {
for (int i = 0; i < names.size(); i++) {
if (names.get(i).equals(target)) {
return i;
}
}
return -1;
}
Als de eerste overeenkomende naam op index 2 staat, controleert de methode indexen 0, 1 en 2 en geeft dan direct 2 terug. De return -1 staat na de lus omdat pas na een volledige doorloop vaststaat dat er geen overeenkomst is. Als je else { return -1; } binnen de lus zet, stopt de methode bij het eerste element dat niet overeenkomt en negeert die alle latere kandidaten.
De waarde -1 die aangeeft dat iets ontbreekt, kan geen geldige index zijn. De aanroeper moet die controleren voordat het resultaat wordt gelezen:
int index = indexOfName(names, "Ahmed");
if (index != -1) {
System.out.println(names.get(index));
}
De test index > 0 zou een geldige overeenkomst op index 0 missen. Als je -1 direct in get gebruikt, wordt een exceptie opgeworpen. Bij een lege lijst wordt de lusbody nooit uitgevoerd en geeft de methode terecht -1 terug.
Pas de vergelijking aan de taak aan
Voor exacte waarden in een lijst voeren contains en indexOf al een lineaire zoekactie uit. Schrijf een lus voor een array of een voorwaarde zoals “begint met L”. Gebruik equals of equalsIgnoreCase voor strings, == voor primitieve waarden en equals voor twee Integer-objecten. Een identiteitstest voor strings kan gelijke tekst missen.
Test voor String[] cities = {"Oslo", "Lima", "Lagos", "Pune"} de voorwaarde cities[i].startsWith("L"). Index 0 voldoet niet; index 1 voldoet wel, dus het resultaat voor de eerste overeenkomst is 1. Als de taak om alle overeenkomsten vraagt, keer je daar niet terug. Voeg overeenkomende indexen toe aan een resultatenlijst en voltooi de doorloop; dat geeft [1, 2]. Om overeenkomsten te tellen, verhoog je een teller in plaats van posities op te slaan.
Kies de vorm van het antwoord
Een ja-of-neezoekactie kan beginnen met boolean found = false;. Zet de waarde bij een overeenkomst op waar en verlaat de lus met break. Zonder die break blijft het eindantwoord waar, maar controleert het programma waarden die het niet meer nodig heeft. Een zoekmethode kan ook direct true teruggeven en na de lus false teruggeven.
Als je een element teruggeeft, is een afzonderlijk resultaat voor “niets gevonden” nodig. Voor een String is dit vaak null; de aanroeper moet daarop controleren voordat die een String-methode aanroept. Als je een index met -1 teruggeeft, is het ontbrekende geval zichtbaar zonder te stellen dat een lege string ontbrekende gegevens zijn.
Tel het werk dat de zoekactie werkelijk doet
Een doelwaarde op de eerste positie vereist één vergelijking. Een doelwaarde op de derde positie vereist er drie. Een ontbrekende doelwaarde in 10.000 namen vereist alle 10.000 vergelijkingen. De eerste mislukte vergelijking kan niet vaststellen dat de doelwaarde ook op de resterende posities ontbreekt. Een zoekactie naar alle overeenkomsten controleert eveneens elk element, ook na een vroege overeenkomst, omdat latere waarden ook kunnen overeenkomen.
Belangrijkste punten
- Lineair zoeken bezoekt elementen op volgorde en werkt bij elke invoervolgorde.
- Geef bij de eerste overeenkomst een index terug; geef -1 pas na de lus terug.
- Gebruik de vergelijking die bij het elementtype past.
- Zoekacties naar alle overeenkomsten gaan na een overeenkomst door met zoeken.
- Controleer op de waarde voor een ontbrekend resultaat voordat je het zoekresultaat gebruikt.
3.4 Verwijder elementen zonder ze over te slaan
Als je elementen uit een ArrayList verwijdert, veranderen de posities die een lus probeert te bezoeken. Het veilige patroon hangt af van de vraag of je de oorspronkelijke lijst wilt wijzigen of een afzonderlijk resultaat wilt opbouwen. Waarden vervangen is eenvoudiger omdat de posities daarbij gelijk blijven.
Bekijk hoe een voorwaartse lus een waarde overslaat
Stel dat een lus even getallen uit [3, 8, 8, 5] verwijdert en i altijd verhoogt. Op index 1 verwijdert de lus de eerste 8. De tweede 8 schuift naar index 1, maar de volgende iteratie gebruikt index 2. Het resultaat is [3, 8, 5], met één even getal over. De voorwaarde was correct; het ging mis door de verschuiving na de verwijdering.
Ook in een for-each-lus over een ArrayList mag je niet via de lijst toevoegen of verwijderen. De lus gebruikt een iterator waarvan de voortgang niet meer overeenkomt met de bewerkte lijst. Java meldt meestal een ConcurrentModificationException. Sommige bewerkingen kunnen de lus in plaats daarvan stilzwijgend beëindigen, waardoor een element niet wordt bezocht. Het ontbreken van een exceptie maakt die bewerking niet veilig.
Verwijder achterwaarts om ongecontroleerde posities stabiel te houden
for (int i = numbers.size() - 1; i >= 0; i--) {
if (numbers.get(i) % 2 == 0) {
numbers.remove(i);
}
}
Bij [3, 8, 8, 5] bevat index 3 de waarde 5 en die blijft staan. Index 2 bevat 8 en wordt verwijderd. Index 1 bevat nog steeds de andere 8 en die wordt daarna verwijderd. Index 0 bevat 3 en die blijft staan. Het resultaat is [3, 5]. Een verwijdering verschuift elementen rechts van de huidige index, die deze achterwaartse lus al heeft gecontroleerd.
Bouw een lijst op met de waarden die je wilt behouden
Als het origineel ongewijzigd moet blijven, maak je een nieuwe lijst:
ArrayList<Integer> odds = new ArrayList<>();
for (int value : numbers) {
if (value % 2 != 0) {
odds.add(value);
}
}
Deze for-each-lus is veilig omdat die numbers leest en aan een andere lijst toevoegt. Met [3, 8, 8, 5] als invoer bevat odds de waarden [3, 5] en bevat de invoer nog steeds alle vier waarden. Ook een array kan niet krimpen; om de waarden daarvan te filteren is eveneens een nieuwe array of lijst nodig.
Laat een iterator zelf verwijderen
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
if (it.next() % 2 == 0) {
it.remove();
}
}
Importeer java.util.Iterator. next() levert het volgende element en it.remove() verwijdert het zojuist teruggegeven element terwijl de positie van de iterator consistent blijft. Gebruik in deze lus niet numbers.remove(...) in plaats daarvan.
Een voorwaartse while-lus kan ook werken door de index alleen te verhogen als er niets is verwijderd. Na een verwijdering moet de lus dezelfde index opnieuw controleren, waar het volgende element terecht is gekomen. Dit vereist meer aandacht dan een achterwaartse lus of een nieuwe resultatenlijst.
Vervangen en toevoegen hebben verschillende effecten
set(i, value) is veilig in een lus met index omdat de grootte en posities niet veranderen. Als je bij elke iteratie toevoegt terwijl je i < list.size() test, kan het einde steeds verder opschuiven en kan de lus oneindig doorgaan. Sla int originalSize = list.size(); op en laat de lus alleen tot die grens lopen wanneer elk oorspronkelijk element tot één toegevoegde waarde moet leiden.
Belangrijkste punten
- Voorwaarts verwijderen gevolgd door
i++slaat het element over dat naar de vrijgekomen plaats is verschoven. - Met een achterwaartse lus kun je veilig op index verwijderen.
- Filteren naar een andere lijst laat het origineel ongewijzigd.
- Gebruik tijdens het doorlopen met een iterator de eigen methode
removevan de iterator. - Tijdens het doorlopen met for-each mag je niet via de bronlijst toevoegen of verwijderen.
- Begrens lussen die achteraan toevoegen met de oorspronkelijke grootte als je alleen oorspronkelijke elementen verwerkt.
4Werk met tekst met behulp van String-methoden
Tekst komt binnen als tekens, maar een programma heeft vaak namen, getallen of geselecteerde delen van een regel nodig. Lees posities met String-methoden, zoek een scheidingsteken voordat je tekst uitsnijdt en zet gescheiden velden om in waarden waarmee je kunt rekenen. Houd de teruggegeven resultaten bij: strings zijn onveranderlijk en een string opschonen helpt latere code alleen als die de opgeschoonde tekst gebruikt.
4.1 Lees tekens en bewaar String-resultaten
Een String bewaart tekst als een reeks char-waarden. Indexen beginnen bij 0, net als bij arrays en lijsten. Een String-object kan na het maken niet veranderen, dus methoden die gewijzigde tekst opleveren geven een resultaat terug dat je moet bewaren.
Een teken verschilt van een string
"Hello".length() is 5. "Hello".charAt(0) is 'H' en charAt(4) is 'o'. Een char gebruikt enkele aanhalingstekens en bevat één UTF-16-code-eenheid; een String gebruikt dubbele aanhalingstekens en kan nul, één of veel van die eenheden bevatten. "Java".charAt(0) == 'J' vergelijkt twee primitieve tekens. Die char vergelijken met "J" compileert niet omdat de typen verschillen.
charAt(length()) ligt voorbij het einde en werpt een StringIndexOutOfBoundsException op. Zelfs charAt(0) faalt bij "". Controleer isEmpty() voordat je het eerste teken van invoer leest.
length() telt UTF-16-char-waarden, die niet altijd volledige weergegeven symbolen zijn. "café".length() is 4; "Hi 👋".length() is 5 omdat de zwaaiende hand als emoji twee char-posities inneemt. Gebruik dat aantal wanneer je de indexen van deze methoden bepaalt.
Bezoek en test de tekens
String text = "Programming in Java".toLowerCase();
int vowels = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if ("aeiou".indexOf(c) >= 0) {
vowels++;
}
}
Door de omzetting naar kleine letters herkent dezelfde lidmaatschapstest zowel hoofdletters als kleine letters onder de klinkers. Elke indexOf(c) is niet-negatief als het teken in "aeiou" voorkomt. De telling komt uit op 6: o, a, i, i, a, a. Met for (char c : text.toCharArray()) kun je dezelfde waarden zonder index bezoeken.
De klasse Character biedt tests zoals isLetter, isDigit, isWhitespace en isUpperCase. Character.isDigit('7') is waar, terwijl Character.isLetter('7') onwaar is. Character.toUpperCase(c) en toLowerCase(c) geven geconverteerde char-waarden terug.
Tekens hebben ook getalcodes. 'a' + 1 levert de int 98 op; (char) ('a' + 1) zet die code om naar 'b'. Bij een ASCII-cijferteken geeft aftrekken van '0' de waarde: '7' - '0' is 7. De code voor nul aftrekken werkt omdat die cijfercodes opeenvolgend zijn.
Lees concatenatie van links naar rechts
| Expressie | Resultaat |
|---|---|
"Total: " + 3 + 4 | "Total: 34" |
3 + 4 + " items" | "7 items" |
"Total: " + (3 + 4) | "Total: 7" |
Zodra de linkerkant van + tekst is, wordt het volgende getal als tekst samengevoegd. Haakjes dwingen de numerieke optelling vóór het samenvoegen af. Enkele samenvoegingen in één expressie zijn een duidelijke toepassing van +.
Sla de teruggegeven tekst op
String name = "Lena";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();
De afdruk toont nog steeds "Lena": de weggegooide aanroep heeft het object niet veranderd. Door de toewijzing verwijst name daarna naar "LENA". Onveranderlijkheid van strings betekent dat de oude tekst ongewijzigd blijft, ook als andere variabelen ernaar verwijzen. Het resultaat bewaren en het oorspronkelijke object veranderen zijn verschillende bewerkingen.
Belangrijkste punten
charAt(i)geeft een char terug; geldige indexen eindigen bijlength() - 1.- Chars gebruiken enkele aanhalingstekens; strings gebruiken dubbele aanhalingstekens.
- De lengte van een string telt UTF-16-charwaarden, dus sommige symbolen nemen twee posities in.
Character-methoden testen en converteren afzonderlijke char-waarden.- Strings samenvoegen met
+gebeurt van links naar rechts. - Sla het resultaat van een String-transformatie op.
4.2 Zoek delen van tekst en haal die eruit
Tekstverwerking volgt vaak een korte reeks stappen: zoek een markering, controleer of die bestaat en haal daarna het benodigde deel eruit. Opschoonbewerkingen kunnen de tekst voorbereiden op een zoekactie of vergelijking. Elke String-bewerking geeft een resultaat terug zonder het oorspronkelijke object te veranderen.
Zoek posities of stel een ja-of-neevraag
Voor "banana" geeft indexOf('a') de waarde 1 terug, indexOf("a", 2) de waarde 3 en lastIndexOf('a') de waarde 5. Het tweede argument bepaalt waar de voorwaartse zoekactie begint. Een zoekactie zonder resultaat geeft -1, zoals in indexOf("x").
Gebruik contains(text) als je alleen hoeft te weten of tekst voorkomt. startsWith(prefix) controleert het begin en endsWith(suffix) het einde. "report.pdf".endsWith(".pdf") is waar. Deze zoekacties zijn hoofdlettergevoelig: "Hello".contains("hello") is onwaar. De indexmethoden accepteren een char of een String; contains neemt tekst als argument.
Een deelstring eindigt vlak vóór de eindindex
String word = "programming";
String middle = word.substring(3, 7);
String tail = word.substring(3);
middle is "gram" en gebruikt de posities 3, 4, 5 en 6. De lengte is 7 - 3, oftewel 4. tail is "gramming", omdat de methode tot het einde van de string loopt als je het eindargument weglaat. De beginindex moet niet-negatief zijn en mag niet groter zijn dan de eindindex; de eindindex mag niet groter zijn dan length(). Ongeldige grenzen werpen een StringIndexOutOfBoundsException op.
Zoek bij een e-mailadres het scheidingsteken voordat je de delen eruit haalt:
String email = "lena.ito@example.com";
int at = email.indexOf("@");
if (at != -1) {
String user = email.substring(0, at);
String domain = email.substring(at + 1);
}
Het scheidingsteken staat op index 8. Het eerste deel eindigt ervoor en geeft "lena.ito"; het tweede begint erna en geeft "example.com". Als de markering ontbreekt, is at gelijk aan -1. Een aanroep van substring(0, at) zonder de controle zou falen. Als je het tweede deel bij at zou laten beginnen, zou de @ in het domein blijven staan.
Schoon alleen op waarop de bewerking gericht is
| Methode | Effect |
|---|---|
toUpperCase() / toLowerCase() | Geeft tekst terug met omgezette hoofdletters of kleine letters |
trim() | Verwijdert aan het begin en einde tekens met codes tot en met U+0020 |
strip() | Verwijdert aan het begin en einde witruimte die Character.isWhitespace herkent |
replace(target, replacement) | Vervangt elk letterlijk voorkomen |
repeat(n) | Voegt n kopieën van de tekst samen |
" hello ".trim() geeft "hello"; spaties binnen de tekst blijven staan. strip() verwerkt extra Unicode-witruimte, zoals een em-spatie. De methode gebruikt de Java-definitie van witruimte, die niet elk teken omvat dat op een spatie lijkt. "banana".replace('a', 'o') geeft "bonono". "ab".repeat(3) geeft "ababab".
Leeg en alleen witruimte zijn verschillend
isEmpty() test op lengte 0. isBlank() accepteert ook tekst die alleen uit Java-witruimte bestaat. Voor " " is de eerste onwaar en de tweede waar. Gebruik de test die bij de invoerregel past. Om een antwoord zoals " Yes " op te schonen, geeft answer.trim().toLowerCase() de waarde "yes" terug. Sla die teruggegeven tekst op als de variabele de opgeschoonde waarde moet bewaren; een losse answer.trim(); gooit die weg.
Belangrijkste punten
- Zoekacties naar posities geven -1 terug als een markering ontbreekt.
substring(begin, end)omvat begin en sluit end uit.- Controleer een gevonden positie voordat je die als grens voor een deelstring gebruikt.
replacevervangt letterlijke tekst;trimenstripwerken aan de uiteinden.isBlankaccepteert tekst met alleen witruimte, terwijlisEmptylengte 0 vereist.
4.3 Zet een tekstregel om in bruikbare velden
Een gegevensregel kan meerdere waarden bevatten die door een komma of een andere markering zijn gescheiden. Splitsen levert een array met strings op; parsen zet daarna geselecteerde velden om naar getallen. Controleer de vorm van de gegevens voordat je posities gebruikt.
Splits naar een array
String[] fields = "Ada,36,London".split(",");
Er zijn drie velden: "Ada", "36" en "London". De komma’s blijven niet behouden. fields.length is 3 en fields[1] is nog steeds tekst, geen getal.
Het scheidingsteken dat aan split wordt doorgegeven, is een reguliere expressie, een patroon dat niet altijd letterlijke tekst is. Een komma betekent zichzelf, maar ., |, *, + en ? hebben een speciale betekenis. Gebruik "1.5.2".split("\\.") om een versiestring bij letterlijke punten te splitsen. Twee backslashes in de Java-string leveren de ene backslash in het patroon op die de punt letterlijk maakt. split(".") komt daarentegen overeen met afzonderlijke tekens en levert voor dit voorbeeld een lege array op.
Handel spaties en lege delen af
Als je "a b" splitst bij " ", krijg je drie delen: "a", "" en "b". Elk scheidingsteken is één spatie, dus opeenvolgende spaties laten een leeg deel ertussen over. Gebruik voor reeksen witruimte:
String[] words = " red green blue ".trim().split("\\s+");
Het resultaat is [red, green, blue]. Door eerst trim te gebruiken, voorkom je een leeg eerste deel door een scheidingsteken aan het begin. Standaard laat split lege delen aan het einde weg: "a,b,,".split(",") levert alleen "a" en "b" op. Tel de werkelijke resulterende velden voordat je ze met een index benadert.
Parse elk veld naar het bedoelde type
Integer.parseInt("42") geeft de primitieve int 42 terug. Integer.valueOf("-7") geeft een Integer-object terug. Double.parseDouble("5.2") geeft 5,2 terug en gebruikt een punt als decimaalteken, ongeacht de landinstellingen van de computer. Bij het parsen van gehele getallen moet de tekst een geheel getal zonder decimaalpunt bevatten. Integer.parseInt("4.5") faalt in plaats van af te ronden.
Gebruik trim op velden voordat je ze parset, vooral bij tekst met gehele getallen: Integer.parseInt(" 42") werpt een NumberFormatException op. Splitsen bij komma’s verwijdert geen spaties rond de velden. Een correct aantal velden garandeert ook niet dat een veld een geldig getal bevat.
Lees een volledig record
String line = "Amira,10.5,63";
String[] parts = line.split(",");
if (parts.length == 3) {
String name = parts[0].trim();
double distanceKm = Double.parseDouble(parts[1].trim());
int minutes = Integer.parseInt(parts[2].trim());
double pace = minutes / distanceKm;
System.out.println(name + ": " + pace + " min/km");
}
De afstand is 10,5 km, de tijd is 63 minuten en het tempo is 6,0 min/km. De onvolledige regel "Amira,10.5" heeft slechts twee velden; zonder controle van het aantal zou parts[2] een ArrayIndexOutOfBoundsException opwerpen. Een programma kan dat onvolledige record overslaan of melden voordat het een ontbrekende positie gebruikt.
Zet weer om naar tekst of voeg tekst samen
String.valueOf(42) en Integer.toString(42) geven beide "42". String.join(", ", List.of("Oslo", "Lima", "Pune")) geeft "Oslo, Lima, Pune" en voegt alleen tussen de delen scheidingstekens in. De methode accepteert een lijst, een array of afzonderlijke stringargumenten. Samenvoegen parset of berekent niets: het combineert de aangeleverde strings.
Belangrijkste punten
splitgeeft een String-array terug en behandelt het scheidingsteken als een patroon.- Escape een letterlijke punt als
"\."in Java-code. - Gebruik trim voordat je bij reeksen witruimte splitst en voordat je velden met gehele getallen parset.
- Standaard laat split lege velden aan het einde weg.
- Controleer het aantal velden en de numerieke tekst voordat je geparste gegevens gebruikt.
- Gebruik
String.joinvoor tekstdelen en parseermethoden voor getallen.
5Vergelijk strings correct en bouw tekst efficiënt op
Tekst die er gelijk uitziet, kan bij verschillende String-objecten horen. Kies een vergelijking die bij de taak past: inhoudelijke gelijkheid, gelijkheid zonder onderscheid tussen hoofdletters en kleine letters, of de tekenvolgorde van Java. Bouw en bewerk daarna grotere stukken tekst met StringBuilder. Als je zowel referenties als teruggegeven waarden volgt, kun je voorspellen of een bewerking bestaande tekst verandert, een resultaat maakt of alleen twee objecten vergelijkt.
5.1 Vergelijk de inhoud en volgorde van strings
Twee variabelen kunnen tekst met dezelfde tekens bevatten zonder naar hetzelfde String-object te verwijzen. Kies een vergelijking op basis van de vraag: gelijke inhoud, gelijke inhoud zonder onderscheid tussen hoofdletters en kleine letters, of welke tekst eerst komt in de volgorde van Java.
Gebruik equals voor inhoud
String answer = new String("yes");
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));
Het eerste resultaat is onwaar: het afzonderlijk gemaakte object is niet het object van de literal. Het tweede is waar omdat de tekens overeenkomen. Identieke literals zoals "yes" == "yes" delen een object en kunnen een identiteitsvergelijking betrouwbaar laten lijken. Tekst die tijdens de uitvoering ontstaat, kan nieuwe of bestaande objecten gebruiken, dus identiteit is geen test om te bepalen of invoer overeenkomt.
equalsIgnoreCase negeert het verschil tussen hoofdletters en kleine letters: "YES".equalsIgnoreCase("yes") is waar. De methode verwijdert geen spaties. Om ook spaties rondom te accepteren, schoon je de invoer vóór het vergelijken op.
Roep bij een variabele die null kan zijn de methode aan op een bekende literal die niet null is: "yes".equals(answer) geeft onwaar terug bij null. answer.equals("yes") werpt een NullPointerException op als answer null is, omdat er geen object is dat de aanroep ontvangt.
Een opdrachtlus kan !command.equals("quit") testen. De ! ontkent de inhoudelijke gelijkheid. command != "quit" test daarentegen referenties en kan een lus laten doorgaan, zelfs als de getypte tekens “quit” vormen.
Interpreteer het teken van compareTo
a.compareTo(b) vergelijkt UTF-16-charwaarden één voor één. De methode geeft een negatief getal terug als a vóór b komt, nul als ze gelijk zijn en een positief getal als de eerste erna komt. Alleen het teken is van belang voor de volgorde; een resultaat hoeft niet precies -1 of 1 te zijn.
| Vergelijking | Teken | Reden |
|---|---|---|
"apple".compareTo("banana") | Negatief | Eerste verschillende char komt eerder |
"pear".compareTo("pear") | Nul | Alle tekens komen overeen |
"car".compareTo("carpet") | Negatief | Gelijk begin, kortere string eerst |
"10".compareTo("9") | Negatief | '1' komt vóór '9' |
Getallen die als tekst zijn opgeslagen, volgen dus niet de numerieke volgorde. Parse ze als de taak numeriek is. Engelse hoofdletters zonder accent komen vóór kleine letters zonder accent, dus "Zebra" komt vóór "apple". In deze volgorde komt "Émile" met accent na "Zoe". compareToIgnoreCase negeert hoofdletters en kleine letters; voor woordenboekvolgorde volgens een specifieke taal is java.text.Collator nodig.
Gebruik het minimumpatroon opnieuw voor namen
Voor een niet-lege lijst [Mia, Ahmed, Lucia]:
String first = names.get(0);
for (String name : names) {
if (name.compareTo(first) < 0) {
first = name;
}
}
"Mia" is de eerste kandidaat. "Ahmed" komt daarvoor en wordt de kandidaat; "Lucia" vervangt die niet. Het resultaat is "Ahmed". Controleer of de lijst leeg is voordat je het eerste element leest.
Een afzonderlijke char is primitief, dus word.charAt(0) == 'A' is een correcte tekenvergelijking zodra vaststaat dat het woord niet leeg is. Het probleem met == betreft objectidentiteit, niet elke vergelijking met tekst.
Belangrijkste punten
- Gebruik
equalsvoor String-inhoud enequalsIgnoreCaseom hoofdletters en kleine letters gelijk te behandelen. - Een bekende literal kan
equalsveilig ontvangen als het argument null kan zijn. ==controleert String-identiteit, ook als gedeelde literals de fout verbergen.- Lees alleen het teken van
compareTo. - De volgorde van Java-strings is UTF-16-volgorde, geen numerieke of taalspecifieke woordenboekvolgorde.
5.2 Bouw en bewerk tekst met StringBuilder
Een StringBuilder bevat veranderlijke tekst. Die is handig als een lus veel delen toevoegt of als tekens ter plaatse moeten worden bewerkt. Als je enkele delen in één expressie samenvoegt, is + duidelijk, maar als je een groeiende String steeds opnieuw opbouwt, kan de opgebouwde inhoud vaak worden gekopieerd.
Voeg delen achteraan toe en sluit af met een String
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
if (i > 1) {
sb.append(", ");
}
sb.append(i);
}
String result = sb.toString();
Er is geen import nodig. append voegt strings, chars, getallen of booleaanse waarden achteraan toe. De eerste iteratie voegt alleen 1 toe; de tweede voegt ", " en daarna 2 toe. Het resultaat is "1, 2, 3, 4, 5". Een scheidingsteken na elk getal zetten zou een ongewenst scheidingsteken aan het einde achterlaten. Voor een bestaande lijst met strings regelt String.join(", ", list) de scheidingstekens direct.
Herhaaldelijk text += piece gebruiken in een lus vormt nieuwe onveranderlijke String-resultaten. Het opgebouwde begindeel moet elke keer worden opgenomen, dus de hoeveelheid die wordt gekopieerd kan kwadratisch groeien naarmate een lang resultaat groeit. Een StringBuilder houdt een veranderlijke buffer bij en voegt daaraan toe zonder bij elke iteratie het hele begindeel opnieuw op te bouwen.
Bewerk posities en bereiken
| Methode | Effect |
|---|---|
insert(i, x) | Voegt in op positie i |
delete(start, end) | Verwijdert een bereik, zonder end |
deleteCharAt(i) | Verwijdert één char |
setCharAt(i, c) | Vervangt één char |
replace(start, end, text) | Vervangt een bereik, zonder end |
reverse() | Keert de volgorde van de StringBuilder om |
length() en charAt(i) lezen de StringBuilder zoals ze een String lezen. Indexen beschrijven de huidige toestand; een invoeging of verwijdering kan latere posities veranderen.
Begin met new StringBuilder("Jva"). insert(1, 'a') levert "Java" op; setCharAt(0, 'j') geeft daarna "java". Bij "2026-10-22" verwijdert delete(4, 7) de posities 4, 5 en 6, zodat "2026-22" overblijft. Als je posities 7 tot en met 9 in "I like tea" vervangt door "coffee", krijg je "I like coffee".
Keten alleen methoden die de StringBuilder teruggeven
new StringBuilder().append("a").append(1).append('b').toString() geeft "a1b". De append-aanroepen geven dezelfde StringBuilder terug, waardoor een volgende aanroep mogelijk is. De bewerkingsmethoden hier geven ook de StringBuilder terug, behalve setCharAt, dat void teruggeeft en een afzonderlijke instructie nodig heeft.
reverse() verandert de ontvanger. Als sb de tekst "stressed" bevat, laat String r = sb.reverse().toString(); zowel r als de tekst van de StringBuilder achter als "desserts". Om de oorspronkelijke StringBuilder te behouden, keer je een nieuwe StringBuilder om die je van de tekst maakt.
Vergelijk de voltooide inhoud
Voeg voor een palindroomcontrole de kleine lettervorm van elke letter in "Was it a car or a cat I saw" toe. De opgeschoonde tekst is "wasitacaroracatisaw". Keer een nieuwe StringBuilder met die tekst om, zet die om naar een String en vergelijk met clean.equals(reversed). De vergelijking is waar.
StringBuilder overschrijft equals niet om de inhoud te vergelijken. Afzonderlijke StringBuilders met "abc" zijn volgens die methode niet gelijk en een StringBuilder is niet gelijk aan een String. Zet eerst om: sb1.toString().equals(sb2.toString()) vergelijkt de werkelijke tekst.
Belangrijkste punten
- Gebruik
appendom een lang resultaat op te bouwen entoStringom het af te sluiten. - Zet scheidingstekens tussen waarden en voorkom een extra scheidingsteken aan het einde.
- Bewerkingen veranderen de bestaande StringBuilder; eindgrenzen van bereiken zijn uitgesloten.
setCharAtgeeft void terug en kan dus niet worden geketend.reverseverandert de StringBuilder waarop je de methode aanroept.- Zet StringBuilders om naar Strings voordat je de inhoud vergelijkt.
Lijsten, arrays en strings in Java: voorbeelden
1Bouw en deel een leeslijst
13 stappen
- 1IntroductieVolg een veranderende leeslijst
Een leeslijst kan leeg beginnen en groeien naarmate suggesties binnenkomen. Je voegt titels toe, corrigeert een item, verwijdert een duplicaat en geeft de lijst door aan een methode. Houd tijdens het volgen van de code twee vragen uit elkaar: welk element staat nu op elke index en welke variabelen verwijzen naar hetzelfde lijstobject? De eerste vraag verklaart veranderingen in posities; de tweede verklaart gedeelde bewerkingen.
- 2UitlegMaak de lege collectie
Importeer
java.util.ArrayListen maak daarna de lijst:ArrayList<String> reading = new ArrayList<>(); reading.add("Orbit"); reading.add("River");Het elementtype is String. De lege lijst groeit tot grootte 2 en bevat
[Orbit, River]. Index 0 duidt Orbit aan en index 1 duidt River aan. Met de diamantoperator<>kan Java het elementtype afleiden van de linkerkant. - 3VoorbeeldVoeg in vóór een opgeslagen titel
Ga verder met dezelfde lijst:
reading.add(1, "Cloud"); String old = reading.set(2, "Forest");Door de invoeging schuift River van index 1 naar index 2 en krijg je
[Orbit, Cloud, River]. De vervanging zet daarna Forest op index 2 en geeft River terug inold. De uiteindelijke lijst is[Orbit, Cloud, Forest]. Anders dan bij invoegen is de grootte door vervangen niet veranderd. - 4UitdagingZoek de volgende geldige positie
De lijst is
[Orbit, Cloud, Forest]. Wat gebeurt er als jereading.add(3, "Dune")aanroept? Wat zoureading.get(3)daarna teruggeven?---reveal---
De invoeging voegt Dune achteraan toe omdat index
size()is toegestaan voor invoegen. De grootte wordt 4, dus index 3 is nu geldig om te lezen en geeft"Dune"terug. Index 3 lezen vóór de invoeging zou zijn mislukt. - 5UitlegVerwijder één waarde en volg de verschuiving
Voeg nog een Cloud toe en verwijder daarna op waarde:
reading.add("Cloud"); boolean removed = reading.remove("Cloud");De lijst vóór de verwijdering is
[Orbit, Cloud, Forest, Dune, Cloud]. Alleen de eerste Cloud wordt verwijderd, dus het resultaat is[Orbit, Forest, Dune, Cloud]enremovedis waar. Forest en elk later element schuiven één positie naar links. De laatste Cloud blijft in de lijst. - 6TipVraag of en waar
Voor
[Orbit, Forest, Dune, Cloud]iscontains("Orbit")waar enindexOf("Orbit")gelijk aan 0. Een test op een gevonden waarde moet index 0 accepteren: gebruikindex != -1nadat je het zoekresultaat hebt opgeslagen. Een ontbrekende titel geeft -1 terug. Zoekacties vergelijken String-inhoud met onderscheid tussen hoofdletters en kleine letters, dus zoeken naar"orbit"vindt"Orbit"niet. GebruiklastIndexOfals de laatste overeenkomende positie ertoe doet. - 7UitdagingVerwijder een getal op basis van de waarde
Een afzonderlijke
ArrayList<Integer>bevat[9, 1, 9]. Je wilt de eerste waarde 9 verwijderen. Welke aanroep werkt en wat blijft over?---reveal---
numbers.remove(Integer.valueOf(9))selecteert verwijdering op waarde en laat[1, 9]over.remove(9)zou index 9 selecteren en die is ongeldig. De primitieve int selecteert een index, ook al bevat de lijst zelf gehele getallen. - 8AnalogieTwee namen voor één notitieboek
Zie een referentie als een briefje waarop staat waar één notitieboek ligt. Een kopie van het briefje maakt geen tweede notitieboek. Met
ArrayList<String> shared = reading;duiden beide variabelen één lijst aan, dusshared.add("Coast")is zichtbaar viareading. Een kopieerconstructor,new ArrayList<>(reading), maakt daarentegen een andere lijst met eigen plaatsen. - 9VoorbeeldKopieer voordat je wijzigt
Begin met
[Orbit, Forest, Dune, Cloud]:ArrayList<String> copy = new ArrayList<>(reading); copy.remove("Dune");De kopie wordt
[Orbit, Forest, Cloud], terwijl reading ongewijzigd blijft. Beide lijsten verwezen aanvankelijk naar dezelfde onveranderlijke String-elementen, maar hun lijstplaatsen zijn afzonderlijk. Een plaats uit de ene lijst verwijderen verwijdert die niet uit de andere. - 10KernpuntEen parameter is een andere lokale naam
Een methode ontvangt een kopie van een lijstreferentie. Als je via die parameter
titles.clear()aanroept, verandert de gedeelde lijst. De toewijzingtitles = new ArrayList<>();verandert alleen de lokale naam, dus de aanroeper behoudt de oude lijst. Een lege lijst is nog steeds een object; null is geen object. Een aanroep vansize()op een lege lijst geeft 0 terug, terwijl een aanroep via null faalt. - 11UitdagingOnderscheid gedeelde bewerkingen van lokale hertoewijzing
De lijst van een aanroeper is
[North, South]. De methode voert deze instructies uit:titles.remove("North"); titles = new ArrayList<>(); titles.add("East");Wat ziet de aanroeper nog?
---reveal---
De aanroeper ziet
[South]. Eerst verandert de verwijdering het gedeelde object. Daarna laat de hertoewijzing alleen de methodeparameter naar een andere lijst verwijzen, dus wordt East aan een andere lijst toegevoegd. De referentie van de aanroeper is nooit omgeleid. - 12UitdagingCombineer kopiëren, zoeken en bewerken
Laat a de lijst
[Lake, Hill]bevatten en voer daarnab = new ArrayList<>(a),b.add("Lake")enb.remove(b.indexOf("Lake"))uit. Wat bevatten a en b en geefta.equals(b)waar terug?---reveal---
De zoekactie geeft index 0 terug, dus b wordt
[Hill, Lake]. Het origineel a blijft[Lake, Hill]. De groottes zijn gelijk maar de volgorde verschilt, dusequalsvan de lijst geeft onwaar terug. - 13SamenvattingVoorspel een wijziging in een lijst
Lees een bewerking door eerst het doel te bepalen: een positie voor
setof verwijdering op index, een waarde voor verwijdering op waarde en een invoegpositie vooradd. Werk daarna verschoven indexen bij voordat je de volgende aanroep volgt. Om te voorspellen wat een andere variabele ziet, volg je of die de lijst deelt of een afzonderlijke kopie bevat. Hertoewijzing in een methode raakt de parameter; bewerkingen raken het object waarnaar die parameter op dat moment verwijst.
2Sla vaste meetwaarden op en kopieer ze
10 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieGeef elke meetwaarde een vaste plaats
- 2UitlegMaak de plaatsen aan
- 3VoorbeeldDruk de benodigde gegevens af
- 4UitdagingLees de laatste plaats
- 5VoorbeeldVolg een alias
- 6VoorbeeldMaak een grotere kopie
- 7UitdagingKies een inhoudelijke vergelijking
- 8VoorbeeldSla op voordat je overschrijft
- 9UitdagingBehoud oude gegevens bij uitbreiding
- 10SamenvattingOnderscheid plaatswijzigingen van nieuwe opslag
3Zet meetwaarden om in resultaten
17 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieGeef elke lus één duidelijke taak
- 2UitlegLees waarden of lees posities
- 3UitdagingLaat ruimte voor een buur
- 4VoorbeeldHoud een som bij tijdens de lus
- 5VoorbeeldDeel en behoud het deel achter de komma
- 6KernpuntEen extremum heeft een echte kandidaat nodig
- 7UitdagingHoud het laatste gelijke maximum bij
- 8UitlegStop pas als het antwoord bekend is
- 9VoorbeeldZoek de eerste meetwaarde boven een grens
- 10UitdagingGa van de eerste overeenkomst naar alle overeenkomsten
- 11VoorbeeldBekijk hoe voorwaarts verwijderen iets overslaat
- 12UitlegDoorloop achterwaarts om te verwijderen
- 13VerbandBehoud de bron door te filteren
- 14TipGebruik de iterator die de doorloop beheert
- 15UitdagingBegrens een lus die achteraan toevoegt
- 16UitdagingBereken het gemiddelde van alleen de geselecteerde waarden
- 17SamenvattingVolg toestand en stopregels
4Lees een tekstrecord in stappen
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVan ruwe tekst naar gegevens
- 2UitlegLees één teken tegelijk
- 3VoorbeeldTel cijfers in een label
- 4UitdagingBewaar een transformatie
- 5UitlegZoek eerst een grens
- 6VoorbeeldTel de opgenomen posities
- 7TipKies de opschoonregel
- 8UitdagingHandel een ontbrekend scheidingsteken af
- 9UitlegSplits het record in velden
- 10VoorbeeldConverteer en bereken
- 11KernpuntScheidingstekens kunnen patronen beschrijven
- 12UitdagingParse na controle van de vorm
- 13UitdagingNormaliseer woorden en voeg ze samen
- 14SamenvattingControleer het resultaattype bij elke stap
5Vergelijk opdrachten en stel een rapport samen
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVergelijk betekenis en bouw een resultaat op
- 2UitlegKies een inhoudstest
- 3VoorbeeldNegeer hoofdletters en kleine letters zonder spaties te negeren
- 4UitdagingLeg een test met literals uit
- 5UitlegOrden op de eerste verschillende char
- 6UitdagingBehoud de vroegste tekstkandidaat
- 7UitlegVoeg toe aan één veranderlijke reeks
- 8VoorbeeldZet scheidingstekens tussen delen
- 9VoorbeeldBewerk de huidige posities
- 10UitdagingBehoud de oorspronkelijke volgorde
- 11UitdagingBouw een gefilterd rapport
- 12SamenvattingGebruik de bewerking die bij de vraag past
Lijsten, arrays en strings in Java: oefenvragen
Set 1: Volg lussen en verwerk tekst10 Oefenvragen
Vraag 1 van 10
{2, 6, 9} na for (int n : values) { n += 3; }?Toon antwoordVerberg antwoord
n. Die lokale variabele bijwerken schrijft niet terug naar een opgeslagen plaats, dus de array blijft [2, 6, 9]. Voor het resultaat [5, 9, 12] is een lus met index nodig die aan values[i] toewijst.Vraag 2 van 10
[5, 8, 9]. Welke waarde levert (double) (total / values.size()) op nadat de som is opgeslagen in een int total?Toon antwoordVerberg antwoord
(double) total / values.size().Vraag 3 van 10
Welk paar drukt deze code af voor de niet-lege lijst [-8, -3, -3, -6]?
int best = 0;
int total = 0;
for (int i = 0; i < values.size(); i++) {
int n = values.get(i);
total += n;
if (n >= values.get(best)) {
best = i;
}
}
System.out.println(best + ": " + (double) total / values.size());
Toon antwoordVerberg antwoord
>= vervangt de kandidaat bij een gelijke waarde, zodat index 2 behouden blijft. Met > zou index 1 behouden blijven, omdat gelijke vervangingen dan worden afgewezen.Vraag 4 van 10
De methode wordt aangeroepen met {“Birch”, “Cedar”, “Maple”} en doelwaarde “Maple”. Wat geeft de methode terug?
static int find(String[] a, String target) {
for (int i = 0; i < a.length; i++) {
if (a[i].equals(target)) return i;
else return -1;
}
return -1;
}
Toon antwoordVerberg antwoord
else geeft direct -1 terug. De lus bereikt index 2 nooit. Een correcte zoekactie naar de eerste overeenkomst zet de terugkeerwaarde voor een mislukte zoekactie na de lus, zodat elke kandidaat kan worden gecontroleerd voordat de doelwaarde als ontbrekend wordt beschouwd.Vraag 5 van 10
Welke lijst blijft over na deze lus?
ArrayList<Integer> a = new ArrayList<>(List.of(4, 4, 7, 2));
for (int i = 0; i < a.size(); i++) {
if (a.get(i) % 2 == 0) a.remove(i);
}
Toon antwoordVerberg antwoord
[4, 7] overblijft. Het resultaat [7] gaat ervan uit dat de verschoven 4 opnieuw wordt bezocht, wat deze onvoorwaardelijke verhoging voorkomt.Vraag 6 van 10
"Count: " + 2 + 6 op?Toon antwoordVerberg antwoord
+ heeft links een string, dus wordt 2 als tekst samengevoegd. De volgende + voegt 6 aan die tekst toe, wat "Count: 26" oplevert. Voor "Count: 8" zouden haakjes rond 2 + 6 nodig zijn om eerst de optelling uit te voeren.Vraag 7 van 10
String code = "AB:472:Q"; de waarde van code.substring(code.indexOf(":") + 1, code.lastIndexOf(":"))?Toon antwoordVerberg antwoord
substring(3, 6). Die omvat de drie cijfers en sluit de dubbele punt aan het einde uit. Als je die laatste dubbele punt meeneemt, behandel je de eindindex ten onrechte als inbegrepen.Vraag 8 van 10
"Mina;18;Oslo".split(";") terug?Toon antwoordVerberg antwoord
String[]. Het veld "18" blijft tekst totdat het wordt geparset; split leidt geen getallen af. Hoewel een ArrayList later de velden zou kunnen bevatten, geeft de methode zelf een array terug.Vraag 9 van 10
Hoeveel velden levert deze expressie op?
"x,y,,".split(",")
Toon antwoordVerberg antwoord
split lege delen aan het einde weg, zodat "x" en "y" overblijven. De methode geeft daarom een array met lengte 2 terug. Als je elke komma telt en er één bij optelt, krijg je vier schijnbare posities, maar negeer je de regel dat lege delen aan het einde worden weggelaten.Vraag 10 van 10
Wat wordt afgedrukt?
String[] p = " Omar, 12, 5 ".trim().split(",");
int distanceKm = Integer.parseInt(p[1].trim());
int hours = Integer.parseInt(p[2].trim());
double speed = distanceKm / hours;
System.out.println(speed);
Toon antwoordVerberg antwoord
Set 2: Maak, bewerk en deel collecties10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Wat drukt dit af?
ArrayList<String> tools = new ArrayList<>(List.of("pen", "ruler"));
tools.add(1, "tape");
String old = tools.set(2, "clip");
System.out.println(old + ": " + tools);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
ArrayList<Integer> bevat [12, 24, 36]. Welke aanroep verwijdert de waarde 24?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
[Nora, Ravi, Nora, Mei]. Wat zijn na names.remove("Nora") de waarden van names.indexOf("Nora") en names.lastIndexOf("Mei"), in die volgorde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Wat is de inhoud van a en c na deze code?
ArrayList<String> a = new ArrayList<>(List.of("oak"));
ArrayList<String> b = a;
ArrayList<String> c = new ArrayList<>(a);
b.add("elm");
c.set(0, "ash");
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Arrays.toString(new boolean[3]) terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
double[] readings heeft lengte 6. Welke expressie leest de laatste plaats?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Wat is de inhoud van a en b na deze code?
int[] a = {7, 3};
int[] b = Arrays.copyOf(a, 3);
b[0] = 8;
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
{6, 2}. Wat zijn de resultaten van a.equals(b) en Arrays.equals(a, b), in die volgorde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Wat bevat de lijst van de aanroeper na edit(a)?
static void edit(ArrayList<Integer> x) {
x.set(0, x.get(0) + 2);
x = new ArrayList<>(x);
x.add(9);
}
// In main:
ArrayList<Integer> a = new ArrayList<>(List.of(5, 8));
edit(a);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Vergelijk waarden en spoor fouten op10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
reply precies “ready” bevat?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
sb.append(3)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
"18".compareTo("4") < 0 en waarom?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Welke tekst is opgeslagen in result?
StringBuilder sb = new StringBuilder("plane");
sb.delete(1, 3);
sb.insert(1, "i");
String result = sb.toString();
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Wat drukt deze code af?
String label = "lamp";
String other = label;
label = label.toUpperCase();
System.out.println(other + ":" + label);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Wat drukt dit af?
String[] a = {"ax", "beta", "brim", "sun"};
int first = -1;
int matches = 0;
for (int i = 0; i < a.length; i++) {
if (a[i].startsWith("b")) {
if (first == -1) first = i;
matches++;
}
}
System.out.println(first + ":" + matches);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Welke lijst blijft over na deze code?
ArrayList<Integer> a = new ArrayList<>(List.of(2, 5, 2));
for (int i = a.size() - 1; i >= 0; i--) {
if (a.get(i) == 2) a.remove(i);
}
int n = a.size();
for (int i = 0; i < n; i++) {
a.add(a.get(i) * 2);
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Wat zijn a en b nadat de code is uitgevoerd?
int[] a = {11, 4, 8};
int[] b = a;
int temp = b[0];
b[0] = b[2];
b[2] = temp;
b = Arrays.copyOf(b, 4);
b[1] = 0;
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
names.indexOf("Iris") >= 0 voordat het get met dat resultaat aanroept. Wat gebeurt er?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Wat wordt afgedrukt?
StringBuilder a = new StringBuilder("drawer");
StringBuilder b = a;
String result = b.reverse().toString();
b = new StringBuilder("x");
System.out.println(a + ":" + result);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Combineer collectie- en tekstbewerkingen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
" ".isEmpty() en " ".isBlank(), in die volgorde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Welke delen levert deze expressie op?
" north east west ".trim().split("\\s+")
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
["zen", "Able", "apple"]. Een lus bewaart de eerste kandidaat en vervangt die als name.compareTo(first) < 0. Welke naam blijft over?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
ArrayList<String> heeft grootte 4. Wat gebeurt er als op add(4, "new") de aanroep get(4) volgt?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Wat zijn de uiteindelijke lijst out en het gemiddelde?
int[] a = {-2, 6, 10, 0};
ArrayList<Integer> out = new ArrayList<>();
int sum = 0;
for (int n : a) {
if (n > 0) {
out.add(n);
sum += n;
}
}
double average = (double) sum / out.size();
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Welke index wordt teruggegeven voor de getoonde invoer?
static int firstLong(String[] words, int min) {
for (int i = 0; i < words.length; i++) {
String clean = words[i].trim();
if (clean.length() >= min) return i;
}
return -1;
}
// Call:
firstLong(new String[] {" ox ", "pine", " map ", "cedar"}, 4)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Wat zijn a en kept na deze code?
ArrayList<Integer> a = new ArrayList<>(List.of(2, -1, -1, 5));
ArrayList<Integer> kept = new ArrayList<>(a);
for (int i = kept.size() - 1; i >= 0; i--) {
if (kept.get(i) < 0) kept.remove(i);
}
a.set(0, 9);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
De methode moet de tekst na de eerste “#” teruggeven, of “missing” als er geen markering is. Welke vervanging laat de methode werken voor zowel de invoer “tag#blue” als “plain”?
static String tail(String s) {
int p = s.indexOf("#");
MISSING
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Welke String geeft de methode terug voor de array {“A”, “B”, “C”}?
static String report(String[] parts) {
StringBuilder sb = new StringBuilder();
for (int i = parts.length - 1; i >= 0; i--) {
if (sb.length() > 0) sb.append("/");
sb.append(parts[i]);
}
sb.deleteCharAt(2);
return sb.toString();
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Wat zijn a en b na change(a)?
static void change(ArrayList<String> x) {
x.remove("red");
x = new ArrayList<>();
x.add("gold");
}
// In main:
ArrayList<String> a = new ArrayList<>(List.of("red", "blue", "red"));
ArrayList<String> b = a;
change(a);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
Accumulator
Achteraan toevoegen
Achterwaarts verwijderen
Alias
b = a is b een alias van a; b.clear() maakt de lijst leeg die via beide variabelen wordt gelezen.Array
Array-initialisator
int[] a = {3, 6, 9}; maakt drie plaatsen met die waarden.ArrayIndexOutOfBoundsException
Arraykopie
Arrays.copyOf(a, 5) wordt gemaakt, kan de opslag vergroten zonder de lengte van a te veranderen.ArrayList
Autoboxing
numbers.add(8) mogelijk, ook al is het elementtype van de lijst Integer en niet int.C
char
"book".charAt(0) teruggeeft is 'b', terwijl "b" een String met lengte 1 is.compareTo
Concatenatie
+ van links naar rechts, tenzij haakjes de groepering veranderen."N=" + 2 + 5 de waarde "N=25" op, omdat de getallen worden samengevoegd nadat de tekst begint.ConcurrentModificationException
D
Deelstring
"planet" selecteer je met substring(1, 4); de deelstring luidt “lan”.Doorlopen
E
Exclusieve eindgrens
substring(2, 5) omvat posities 2, 3 en 4, maar laat positie 5 weg.F
Filter
for-each-lus
G
Geheeltallige deling
17 / 4 gelijk aan 4; als je eerst een operand expliciet converteert, is het resultaat met een deel achter de komma 4,25.H
Hoofdlettergevoelige vergelijking
equals stelt vast dat “Go” en “go” een verschillende inhoud hebben.I
Identiteitsvergelijking
a == b is onwaar voor afzonderlijke arrays die dezelfde gehele getallen bevatten.Index
get(3) leest dat element.Inhoudelijke gelijkheid
Arrays.equals(a, b), niet met equals van de array.Inhoudelijke vergelijking
reply.equals("go") herkent overeenkomende tekst ook als de objecten verschillen.Iterator
it.remove() en tegelijk doorgaan met het doorlopen van de lijst.L
length-veld
new int[4] is 4, zelfs voordat het programma eigen waarden naar de plaatsen schrijft.Letterlijke vervanging
replace(".", "-") verandert de punten in “a.b.c” in koppeltekens.Lexicografische volgorde
Lineair zoeken
Lus met index
names.get(i) te lezen en i + 1 weer te geven.Lusgrens
i < a.length - 1 laat ruimte om de rechterbuur op a[i + 1] te lezen.M
Maximum
{-7, -2, -5} is -2, wat een op nul geïnitialiseerde beste waarde niet zou opleveren.Methoden ketenen
sb.append("x").append(2) mogelijk, maar kan niet doorgaan vanaf setCharAt, dat void teruggeeft.N
NaN
0.0 / 0 wordt berekend, levert NaN op in plaats van een bruikbare meetwaarde.Niet-wijzigbare lijst
List.of("east", "west") teruggeeft, wijst een latere aanroep van set af.null
length() aanroept op een String die een zoekactie mogelijk teruggeeft.NumberFormatException
Integer.parseInt(" 18") omdat de spatie aan het begin niet wordt geaccepteerd.O
Ondiepe kopie
Onveranderlijkheid
toUpperCase() bewaart.Overladen methodevariant
P
Palindroom
Parsen
Integer.parseInt faalt omdat die methode tekst met gehele getallen zonder decimaalpunt accepteert.R
Referentie
Reguliere expressie
S
Samenvoegen
String.join("/", pieces) zet de delen “a”, “b” en “c” om in de tekst “a/b/c”.Signaalwaarde
Splitsen
Standaardwaarde
String
StringBuilder
Structurele wijziging
T
Tijdelijke variabele
U
Unboxing
int first = numbers.get(0); een Integer-lijstelement leest.UTF-16-code-eenheid
length() teruggeeft.V
Veld
Verwijdering op index
[a, b, c] in [a, c] wanneer remove(1) het middelste element verwijdert.Verwijdering op waarde
[a, b, a] één dubbele waarde over nadat remove("a") de eerste a heeft verwijderd.Voortijdige terugkeer
Voorwaardelijke telling
W
Waardeoverdracht
Wijziging ter plaatse
reverse() verandert de oorspronkelijke StringBuilder, zodat aliassen de omgekeerde tekst ook zien.Witruimte
Character.isWhitespace, dat ook wordt gebruikt door strip() en isBlank().Wrapperklasse
Integer kan een ArrayList<Integer> getallen opslaan die als int-waarden worden aangeboden.Z
Zoekpredicaat
city.startsWith("M") vindt namen op basis van een voorwaarde in plaats van één exacte waarde.Zoekresultaat
names.indexOf("Kai") kan 0 zijn, dus een test of iets is gevonden moet die index accepteren.- 1Eerste Java-programma’s
- 2Voorwaarden en lussen in Java
- 3Java-methoden
- 4Lijsten, arrays en strings in Java
- 5Java-klassen en objecten
- 6Objecten, referenties en gelijkheid in Java
- 7HashMaps en collecties in Java
- 8Overerving in Java
- 9Excepties en bestanden in Java
- 10Klassendiagrammen en unittests in Java
- 11Lambda-expressies en streams in Java
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.