01. juni 2007 - 12:34Der er
13 kommentarer og 1 løsning
blade bogstaver i en tekst
hey hvordan blander man en bogstaverne i en tekst, det første og sidste bogstav skal bevares det er resten der skal blandes. feks søren = sreøn osv, der skal tages højde for komma og punktum. jeg ved ikke hvor lang teksten er. teksten skal skrives til en ny string...
Du kan benytte metoden "public String[] split(String regex)" på strings. Den returnere et String array indeholdende hvert enkelt ord i din tekst. Du kan nu, på hvert enkelt plads i arrayet, benytte metoden "public char[] toCharArray()" der splitter hver enkelt string op i et char Array.
Jeg antager nu at alle kommaer eller punktummer kommer direkte i forlængelsen af et ord. (f.eks. "hej med dig, jeg hedder jakob". Og ikke "hej med dig , jeg hedder jakob").
Hvis denne antagelse holder stik, ved du at det sidste element i dit char array muligvis indeholder et komma eller et punktum. Vi ved altså at der ikke skal pilles ved det første element og det sidste, og muligvis heller ikke det næstsidste.
Du kan nu begynde at kopiere hvert enkelt elemtent i char arrayet over i et nyt char array. Benyt f.eks. nextInt() fra Random klassen til at beslutte hvilke pladser de enkelte karakterer skal have i det nye array, men husk ikke at rode rundt med det første, det sidste og evt. det næst sidste element.
Nu skal det hele bare samles igen. Det kan gøres ved at oprette en ny string, og concatinerer hvert enkelt element i hvert enkelt af de nye char arrays ved at benytte toString(). Og husk at sætte mellemrum ind mellem hvert char array.
Collections.shuffle() .. snedigt, den kendte jeg ikke ;-) Den er nok at foretrække frem for min ide om Random klassen..
Så vidt jeg kan se tager funktionen højde for det første og det sidste bogstav i s (argumentet), men ikke kommaer og punktummer samt at bevare start og slut bogstavet i det enkelte ord. Men den spiller vist tilsyneladende på hvert ord enkeltvis.
Men man skal vist lige være opmærksom på at bruge den på hvert enkelt ord (hvis jeg har forstået problemstillingen rigtigt) samt at holde styr på komaer og punktummer.
Og hvis generics og char[] versus Character[] havde vaeret lidt mere "samarbejdsvillig" havde vi sparet endnu mere kode, men alle min forsoeg med Arrays.asList og lst.toArray faldt ikke heldige ud.
Det er ikke godt at vide helt konkret hvad der er problemstillingen går ud på, jeg havde forsået, at det var en string der indeholder f.eks. en sætning, eller et helt afsnint af et eller andet, og at bogstaverne i hvert enkelt ord skal blandes, men at ordene, kommaer samt punktummer skal bibeholde deres posision i "teksten".
Men hvis jeg så har forsået problemet korrekt er det bare at hugge den oprindelige string op vha. f.eks. split() og så bruge arne_v's metode på hvert enkelt ord.
public class ShuffleWithinWords { public static String shuffleWord(String s) { List<Character> lst = new ArrayList<Character>(); for(int i = 1; i < s.length() - 1; i++) lst.add(s.charAt(i)); Collections.shuffle(lst); StringBuffer sb = new StringBuffer(); sb.append(s.charAt(0)); for(int i = 0; i < lst.size(); i++) sb.append(lst.get(i)); sb.append(s.charAt(s.length() - 1)); return sb.toString(); } public static String shuffleText(String s) { StringBuffer sb = new StringBuffer(); Pattern p = Pattern.compile("([A-Za-zÆØÅæøå]+)([ .,;]+)"); Matcher m = p.matcher(s); while(m.find()) { sb.append(shuffleWord(m.group(1))); sb.append(m.group(2)); } return sb.toString(); } public static void main(String[] args) { System.out.println(shuffleText("Dette er en lille test med ord af forskellig længde.")); } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.