Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2020-02-19, 16:06
  #13
Medlem
Det löste sig med String.join("\n", list). Då kunde man ta bort radbrytningen från letter = letter + items.get(i) + "\n";. Tusen tack för hjälpen! Jag återkommer.
Citera
2020-02-19, 17:01
  #14
Medlem
Citat:
Ursprungligen postat av KarlXVII
Det löste sig med String.join("\n", list). Då kunde man ta bort radbrytningen från letter = letter + items.get(i) + "\n";. Tusen tack för hjälpen! Jag återkommer.

Jag försökte en gång till lösa det även utan String.join bara för skojs skull och det verkar funka såhär också:

String letters = "";
for (String item: items) {
letters += "\n" + item;
}
Då kan man bara returnera tillhörande text + letters rakt av och de hamnar snyggt på var sin rad utan att det blir radavbrytning efter sista item.
Citera
2020-02-19, 20:22
  #15
Moderator
Protons avatar
Citat:
Ursprungligen postat av KarlXVII
Jag försökte en gång till lösa det även utan String.join bara för skojs skull och det verkar funka såhär också:

String letters = "";
for (String item: items) {
letters += "\n" + item;
}
Då kan man bara returnera tillhörande text + letters rakt av och de hamnar snyggt på var sin rad utan att det blir radavbrytning efter sista item.
Fast där kommer du iofs få in ett newline innan ditt första item, har du då inte bara flyttat problemet från slutat av ditt resultat till början av det?

Ett sät att lösa det på 'r att göra som ditt första försök (med newline på slutet) och sedan när iterationen är klar trimma bort ditt sista newline.

Ett annat, om än aningen mer omständigt, är ju att kolla för varje varv om du har fler element i listan och i sådana fall lägga till ett newline. Då kan du med andra ord hoppa över din newline på sista raden.

En tedje approach kan ju vara att använda Iterator-interfacets hasNext-metod för att avgöra om du är på sista elementet eller ej:

Kod:
String test "";
Iterator<Stringiter = list.iterator();
while(
iter.hasNext()){
test += iter.next();
if(
iter.hasNext())
test += "\n";
}

System.out.println(test); 

Den där borde funka med, iaf i min fantasi
__________________
Senast redigerad av Proton 2020-02-19 kl. 20:29.
Citera
2020-02-26, 19:08
  #16
Medlem
Jag har ett nytt problem, denna gång med binärsökning. Jag har en ArrayList med items som alla har har ett id-nummer (av typen long). Man ska kolla om det eftersökta id-et (ges som parameter till metoden) finns med på listan och så ska man returnera dess index, eller -1 om det inte finns. Här är metoden:

public static int binarysearch(ArrayList<Item> items, long searchedId) {

Alltså om det handlade om en array i stället så skulle det vara lättlöst - det kan jag - men här blir det problem. Och det där att searchedId är long och inte int gör det ännu bökigare.

Det finns även dessa metoder att tillgå:

getId();
getName(); (varje item har även ett namn)

Hur ska man gå till väga när man ska jämföra indexet av det sökta id-et och det mittersta?

int start = 0;
int end = items.size() -1;
int middle = (start + end) / 2;
Citera
2020-02-27, 17:56
  #17
Medlem
Om jag minns rätt så går binärsökning på en sorterad lista och delar upp den i halvor ner till man hittat det man söker.

Kanske något sånt här (ej testat).

Kod:
public static int binarysearch(ArrayList<Item> items, long searchedId) {
	if (items.isEmpty()) {
		return -1;
	} else if (items.size() == 1) {
		if (items.get(0).getId() == searchedId) {
			return 0;
		} else {
			return -1;
		}
	} else {
		int middle = items.size / 2;
		if (items.get(middle).getId() == searchedId) {
			return middle;
		} else if (items.get(middle).getId() < searchedId) {
			return binarysearch(items.subList(0, middle), searchedId);
		} else {
			return middle + binarysearch(items.subList(middle, items.size()), searchedId);
		}
	}
}
Citera
2020-02-27, 21:43
  #18
Medlem
Citat:
Ursprungligen postat av KarlXVII
Jag har ett nytt problem, denna gång med binärsökning. Jag har en ArrayList med items som alla har har ett id-nummer (av typen long). Man ska kolla om det eftersökta id-et (ges som parameter till metoden) finns med på listan och så ska man returnera dess index, eller -1 om det inte finns. Här är metoden:

public static int binarysearch(ArrayList<Item> items, long searchedId) {

Alltså om det handlade om en array i stället så skulle det vara lättlöst - det kan jag - men här blir det problem. Och det där att searchedId är long och inte int gör det ännu bökigare.

Det finns även dessa metoder att tillgå:

getId();
getName(); (varje item har även ett namn)

Hur ska man gå till väga när man ska jämföra indexet av det sökta id-et och det mittersta?

int start = 0;
int end = items.size() -1;
int middle = (start + end) / 2;
Om du kan lösa uppgiften om uppgiften handlar om en array så kan du lika enkelt lösa denna då du ska använda dig av en ArrayList. Skillnaden är inte alls stor. I en array så refererar du till elementen i arrayen med items[middle]. Skillnaden här med en ArrayList är att du kommer åt elementen med metoderna get/set (d v s i detta fall items.get(middle)). Och att id ska vara en long är ju inget problem i sig (blandar du kanske ihop index i ArrayList (int) och id av elementen (long)?).
Så något liknande skulle kunna fungera (antar att du tidigare kollat att alla index är korrekta)
Kod:
long itemID = items.get(middle).getId();
if(itemID == searchedId) {
    // Item found, return index
}
else {
   // Item not found, check if searchID is less or greater than itemID
   // and update start/end accordingly
}
Citera
2020-02-28, 08:34
  #19
Medlem
Citat:
Ursprungligen postat av DieTrolle
I en array så refererar du till elementen i arrayen med items[middle]. Skillnaden här med en ArrayList är att du kommer åt elementen med metoderna get/set (d v s i detta fall items.get(middle)).

[/code]
Ja men det var precis det här som var problemet. I en tabell var det bara så enkelt med items[middle] == searchedId. Så items.get(middle).getId() == searchedId löste problemet. Tack för båda två som kom med det!
Citera
2020-02-29, 09:31
  #20
Medlem
Citat:
Ursprungligen postat av KarlXVII
Ja men det var precis det här som var problemet. I en tabell var det bara så enkelt med items[middle] == searchedId. Så items.get(middle).getId() == searchedId löste problemet. Tack för båda två som kom med det!

Så här blev det till slut.

public static int binarysearch(ArrayList<Item> items, long searchedId) {
int start = 0;
int end = items.size() - 1;

while (start <= end) {
int middle = (start + end) / 2;
int itemId = items.get(middle).getId();
if (itemId == searchedId) {
return middle;
} else if (itemId < searchedId) {
start = middle + 1;
} else {
end = middle - 1;
}
}

return -1;
}
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback