(ArrayList<String>)

Tags:    java

Hej

Jeg er helt ny i java, men laver lidt forskellige opgaver.

Jeg er ved, at prøve med denne:

Denne metode tager en liste af strenge (ArrayList<String> ) der muligvis indeholder
dubletter. Med dubletter menes strenge, der indeholder identisk tekst og ikke referencer til det
eksakt samme objekt. Når metoden finder to eller flere dubletter skal alle dubletterne ændres
således at de får et tal tilføjet. Den første udgave af dubletten skal have et 1 tilføjet, den anden 2 osv.
Den modificerede liste skal være tilgængelig for den, der har kaldt funktionen ved at den originale
input liste modificeres. I den rigtige retur værdi skal det maksimale antal fundne identiske strenge
returneres.
Eksempel: {”hund”, ”kat”, ”kat”, ”ged”, ”hund”} >
{”hund1”, ”kat1”, ”kat2”, ”ged”, ”hund2”}

Nogen der har et godt bud på, hvordan jeg kan løse denne.?



4 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Hmm uh... Her skal man nok tænke sig om for man kan måske komme til at lave en halv langsom algoritme hvis man ikke tænker lidt over det.

Personligt vil sorterer din arrayliste ud fra alfabetisk rækkefølge. Når det er gjord er det let er se om der er nogen dubletter, for de kommer jo lige efter hinanden. Altså skal man altså bare hele tiden sammenligne med strengen før i din ArrayList. Dette vil nok være en af de hurtigste løsninger...


For at sorterer din arrayliste kan du benytte Collection.sort. Her er et lille eksempel:

Fold kodeboks ind/udKode 




Da det nur er fredag og du, hvis du er AAU student, ikke kan nå at bruge dette indlæg er her mine løsningsforslag:


Jeg kan se tre måder at løse det på, den første måde er at bruge Theis ide, men samtidig sortere et array af indeksne på samme som det oprindelige array. Derefter bruge Theis metode til at nummerer de enkelte elementer i arrayet og så sortere de to arrays igen ved at sortere på det nu usorteret indeks array og lave de samme ændringer i det oprindelige array.

Den anden måde er at bruge det AAU studenten foreslår, hvor man så må håbe at der er mange ens værdier ellers er det nok en O(n^2) algoritme det han foreslår.

Den tredje måde er at have en sepaperat datastruktur der indeholder de unikke strenge i array samt en counter til denne hver streng. For hvert element i array skal der undersøges om strengen er i data strukturen hvis den er bruges counteren til at nummerer strengen hvis ikke lægges strengen i data strukturen. Da du skal lade datastrukturen igennem for hver streng vil et valg af datastruktur andet end et array muligvis kunne optimere dette foreslag



Hmm uh... Her skal man nok tænke sig om for man kan måske komme til at lave en halv langsom algoritme hvis man ikke tænker lidt over det.

Personligt vil sorterer din arrayliste ud fra alfabetisk rækkefølge. Når det er gjord er det let er se om der er nogen dubletter, for de kommer jo lige efter hinanden. Altså skal man altså bare hele tiden sammenligne med strengen før i din ArrayList. Dette vil nok være en af de hurtigste løsninger...


For at sorterer din arrayliste kan du benytte Collection.sort. Her er et lille eksempel:

Fold kodeboks ind/udKode 


Det var en mulighed, men han har ikke postet hele opgaven, det er vidst med 99% sandsynlighed en studerende fra AAU. Og der skal i så fald beholdes den samme rækkefølge, sådan som jeg forstår opgaven.. Jeg vil gerne komme med en løsning men ikke før fredag kl.12 hvor der er afleveringsfrist. Da udvikleren ikke er til at få andre til at lave ens opgaver, men hjælp til dem, så jeg kan sige kig på indexOf og evt. lastIndexOf.

M.v.h. Johnny Rosenkjær



Indlæg senest redigeret d. 17.06.2010 14:35 af Bruger #6080
Jeg kan ikke helt gennemskue de andres foreslag. Men er ærgeligt hvis du ikke må sorterer din arraylist. Det ville nemlig kunne gøre det meget hurtigere.

Men altså hvis det er helt galt må du eventuelt bare tage første element og tjekke og kalde det ###1. Næste element bliver du så nød til at tjekke første element hvor at side om de er ens og der efter kalde dem %%%1 eller %%%2. Og så videre.

På den måde skal du lave 1+2+3+...+n gange, hvor n er antal elementer i din arraylist. Ja okay, jeg ved godt at dette bliver en UTROLIG langsom løsning (tror det er O(n^2), men det er da i det mindste en løsning. Hvor stor en mængde elementer skal du kunne behandle?



t