23. januar 2006 - 12:56Der er
29 kommentarer og 1 løsning
Palindrom kendkendelse
Er der nogen som kan hjælpe mig med at finde en funktion, som kontrollerer om et String input er et palindrom - dvs. staves ens forfra og bagfra, F.eks. "Elg udnytter ret tynd ugle".
Dog skal evt. mellemrum, komma og lign ikke medregnes i palindromet.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
public class Palindrom { public static void main (String[] args) { String testText = "Elg udnytter ret tynd ugle"; System.out.println (isPalindrom (testText)); }
public static boolean isPalindrom (String text) { text = text.replace (" ", ""); text = text.toLowerCase(); if (text.length() % 2 != 0) return false;
jeg foretrækker denne (definere hvilke bogstaver der skal tælle med)
boolean static testPalindrom( String kandidat ) { String alfabet = "abcdefghijklmnopqrstuvwxyz"; // tilføj evt andre bogstaver der også skal 'tælle med' kandidat = kandidat.toLowerCase(); // så 'a'=='A', osv char[] temp = new char[kandidat.length()]; int i = 0; int j = 0; for( i=0; i<kandidat.length(); i++ ) { if( alfabet.indexOf( kandidat.charAt(i) ) >= 0 ) { temp[j++] = kandidat.charAt(i); // kun de bogstaver der skal testes på } } i = 0; j--; while ( i<j ) { if ( temp[i] != temp[j] ) break; // forlad løkken hvis vi ser en forskel i++; j--; } return i>= j; // hvis vi ikke forlod løkken i utide er det et palindrom. }
men det er vist mest en smagssag. og mikkel er klart først.
Det kan det godt nok ikke (den der reverse funktion ville være rar at have)
men hvis det skal være på den måde så kan det da godt blive kortere i java :-))
static boolean testPalindrom( String kandidat ) { String alfabet = "abcdefghijklmnopqrstuvwxyzæøå"; // tilføj evt andre bogstaver der også skal 'tælle med' kandidat = kandidat.toLowerCase(); // så 'a'=='A', osv int i = 0; int j = kandidat.length()-1; while ( true ) { while ( i<j && alfabet.indexOf( kandidat.charAt(i) ) < 0 ) i++; // skip tegn og spaces while ( i<j && alfabet.indexOf( kandidat.charAt(j) ) < 0 ) j--; // skip tegn og spaces if ( i >= J ) return true; // slut. alt er godt if ( temp[i] != temp[j] ) return false; // slut. den gik ikke i++; j--; } }
Men kan man i det mindste ikke bruge Regular Expressions til at fjerne uønskede tegn? Det siges at være meget hurtigere. [^\d\w] matcher alt andet end bogstaver og tal.
Jo man kan bruge regular expression til at fjerne uønskede. String replaceAll(String regex, String replacement) Replaces each substring of this string that matches the given regular expression with the given replacement. fra: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html ( den der java API er dejlig at slå op i :-))
men regular expressions er tek der nok mere forvirrer end informerer når 'finde et palindrom' stadig er en svær opgave.
Ved ikke hvem jeg skal smide pointene til, da der er ingen som er kommet med et svar, men mikkelbm eller jakoba er nok mest overskueligt fra min side af!
Efter at have kigget en del på mikkelbm's bud på, er jeg stødt på en forhindring fra min side af.
Eftersom han bruger en påforhånd defineret "String testText", har jeg ikke lige kunne omskrive denne, så man kan komme med andre input - dvs. ikke en på forhånd defineret palindrom, men en valgfri tekst som brugeren skriver ind.
Er det muligt der stadig er nogen som kan hjælpe med dette ?
public static boolean isPalindromeJakob( String kandidat ) { String alfabet = "abcdefghijklmnopqrstuvwxyz"; // tilføj evt andre bogstaver der også skal 'tælle med' kandidat = kandidat.toLowerCase(); // så 'a'=='A', osv char[] temp = new char[kandidat.length()]; int i = 0; int j = 0; for( i=0; i<kandidat.length(); i++ ) { if( alfabet.indexOf( kandidat.charAt(i) ) >= 0 ) { temp[j++] = kandidat.charAt(i); // kun de bogstaver der skal testes på } } i = 0; j--; while ( i<j ) { if ( temp[i] != temp[j] ) break; // forlad løkken hvis vi ser en forskel i++; j--; }
return i>= j; // hvis vi ikke forlod løkken i utide er det et palindrom. } }
Umiddelbart virker det fornuftigt nok med din metode, men den er ikke så venlig overfor ,.' og lign tegn. Men vil man ikke kunne bruge en metode, så den kun bruger "letters" ?
har ogå lige gennemgået funktionerne igen, den er kan ikke finde ud af hvis det er flere end ét ord... dvs. "Elg udnytter ret tynd ugle" betegner den ikke som et palindrom.
Det er den ret nødt til. Den kan jo ikke checke datatype på parametrene førend den ved hvilken type objekt metoden 'equals' bliver kaldt i. men jeg er ikke 100%. har ikke testet.
det nærmeste jeg kan komme til en garanti for at det virker er http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7 '.' er en operator der sammenknytter objektet med metodenavnet, og dermed bør objektet (på venstre side af '.') være færdigevalueret førend runtime tager fat på metoden og dens parametre.
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.