2010-04-16 19 views
5

Dizginin belirli bir karakter kümesini, etkin bir şekilde karşılık gelen bir değiştirme karakteri ile değiştirmek istiyorum. ÖrneğinBir java'daki karakterler nasıl değiştirilir String?

:

String sourceCharacters = "šđćčŠĐĆČžŽ"; 
String targetCharacters = "sdccSDCCzZ"; 

String result = replaceChars("Gračišće", sourceCharacters , targetCharacters); 

Assert.equals(result,"Gracisce") == true; 

String sınıfı replaceAll yöntemi kullanmak daha verimli bir şekilde bulunmaktadır mi?

Benim ilk fikirdi:

final String s = "Gračišće"; 
String sourceCharacters = "šđćčŠĐĆČžŽ"; 
String targetCharacters = "sdccSDCCzZ"; 

// preparation 
final char[] sourceString = s.toCharArray(); 
final char result[] = new char[sourceString.length]; 
final char[] targetCharactersArray = targetCharacters.toCharArray(); 

// main work 
for(int i=0,l=sourceString.length;i<l;++i) 
{ 
    final int pos = sourceCharacters.indexOf(sourceString[i]); 
    result[i] = pos!=-1 ? targetCharactersArray[pos] : sourceString[i]; 
} 

// result 
String resultString = new String(result); 

Herhangi bir fikir?

Btw, UTF-8 karakterleri sorun yaratıyor, US_ASCII ile iyi çalışıyor.

cevap

14

Sen java.text.Normalizer kullanımı ve regex bir atış yapabilirsiniz kadarıyla topladık daha çok fazlası var biri arasında diacritics kurtulmak için. Bu konsol karakteri ile Eclipse de burada yaptığı

package com.stackoverflow.q2653739; 

import java.text.Normalizer; 
import java.text.Normalizer.Form; 

public class Test { 

    public static void main(String... args) { 
     System.out.println(removeDiacriticalMarks("Gračišće")); 
    } 

    public static String removeDiacriticalMarks(String string) { 
     return Normalizer.normalize(string, Form.NFD) 
      .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
    } 
} 

Bu en az

Gracisce

vermelidir:

İşte Java 6 üzerine copy'n'paste'n'run, bir SSCCE var kodlama UTF-8 olarak ayarlanmış (Pencere> Tercihler> Genel> Çalışma Alanı> Metin Dosyası Kodlaması). Aynı şeyin ortamınızda da ayarlandığından emin olun.

Map<Character, Character> charReplacementMap = new HashMap<Character, Character>(); 
charReplacementMap.put('š', 's'); 
charReplacementMap.put('đ', 'd'); 
// Put more here. 

String originalString = "Gračišće"; 
StringBuilder builder = new StringBuilder(); 

for (char currentChar : originalString.toCharArray()) { 
    Character replacementChar = charReplacementMap.get(currentChar); 
    builder.append(replacementChar != null ? replacementChar : currentChar); 
} 

String newString = builder.toString(); 
+0

elde ederim: GraA? IA¡Ae. ve btw, sadece diacritic karakterleri değil, diğer dilleri de değiştirmeyi çok isterim. bu yüzden keyfi bir haritalama için çalışan bir çözümü bilmek istiyorum. – ManBugra

+1

Tam olarak. Sorun, aksanların bazen bir araya getirilmesi, bazen de olmaması ve karakter karakterinin yerine geçen dizgenin karıştırılmasının, aslında iki karakterin olmamasından dolayı karıştırılmamasıdır. –

+0

@Mr. Parlak ve Yeni: evet, System.out.println ("š" .toCharArray(). Uzunluk); çıkışlar '2' – ManBugra

0

basit bir döngü içinde replace yöntemi kullanmak istiyorum:

alternatif olarak, bir Map<Character, Character> korumak. Bu çözelti ile

String sourceCharacters = "šđćčŠĐĆČžŽ"; 
String targetCharacters = "sdccSDCCzZ"; 

String s = "Gračišće"; 
for (int i=0 ; i<sourceCharacters.length() ; i++) 
    s = s.replace(sourceCharacters.charAt[i], targetCharacters.charAt[i]); 

System.out.println(s); 
+0

her yineleme yeni bir dize nesnesi oluşturur.'yerinde' yapmak güzel olurdu – ManBugra

+0

İlk olarak, her yineleme bir değişiklik yapıldığında sadece yeni bir nesne yapar; aranan karakter bulunmuyorsa, orijinal nesne döndürülür. İkincisi, bu işi “StringBuilder” veya “StringBuffer” kullanarak yazmak için * çok daha fazla can sıkıcıdır. Java'nın bellek yönetimi her ne kadar hızlı nesne değişimi için ayarlandığından, nasıl verimli olacağımı anlamaya çalışmak yerine gösterdiğim şekilde yapmak daha kolay. Gerçekten gerekliyse, daha sonra her zaman optimize edebilirsiniz (yani, gerçek bir darboğazsa). –

+0

evet, ilk noktanız doğru. ama senin ikincisine katılmıyorum. Etkin kodu bir kez yazarsınız, hatta rahatsız edici ve tekrar kullanmaktan daha iyidir. Neyse BalusC bilmeceyi çözdü. – ManBugra

İlgili konular