2010-04-16 15 views
5

मैं एक स्ट्रिंग के पात्रों के एक निश्चित सेट को एक प्रभावशाली तरीके से संबंधित प्रतिस्थापन चरित्र के साथ प्रतिस्थापित करना चाहता हूं।जावा स्ट्रिंग में वर्णों को कैसे बदलें?

उदाहरण के लिए:

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

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

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

अधिक कुशल तरीका स्ट्रिंग वर्ग के replaceAll विधि का उपयोग करने से देखते हैं है?

मेरा पहला विचार था:

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); 

कोई भी विचार?

बीटीडब्ल्यू, यूटीएफ -8 वर्ण परेशानी पैदा कर रहे हैं, यूएस_एएससीआईआईआई यह ठीक काम करता है।

उत्तर

14

आप regex के एक शॉट java.text.Normalizer के उपयोग और कर सकते हैं वहाँ मौजूद ज्यादा से अधिक आप के रूप में अब तक एकत्र किया जिनमें से diacritics से छुटकारा पाने के।

यहाँ एक SSCCE है, जावा 6 पर यह copy'n'paste'n'run:

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}+", ""); 
    } 
} 

यह उपज चाहिए

Gracisce

कम से कम, यह सांत्वना चरित्र के साथ ग्रहण पर यहाँ करता है यूटीएफ -8 (विंडो> वरीयताएँ> सामान्य> वर्कस्पेस> टेक्स्ट फ़ाइल एन्कोडिंग पर एन्कोडिंग सेट)। सुनिश्चित करें कि यह आपके पर्यावरण में भी सेट है।

एक विकल्प के रूप में, बनाए रखने के एक Map<Character, Character>:

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

इस समाधान के साथ मुझे मिलता है: GraA? IA¡Ae। और बीटीडब्ल्यू, मैं न केवल विशिष्ट वर्णों को बदलना चाहता हूं बल्कि अन्य भाषाओं के कुछ अन्य लोगों को भी बदलना चाहता हूं। तो मैं वास्तव में एक समाधान जानना चाहता हूं जो मनमाने ढंग से मैपिंग के लिए काम करता है। – ManBugra

+1

बिल्कुल। समस्या यह है कि diacritics कभी-कभी संयुक्त होते हैं, कभी-कभी नहीं, और स्ट्रिंग चरित्र-दर-चरित्र प्रतिस्थापन भ्रमित हो जाता है क्योंकि वास्तव में दो अक्षर होते हैं, एक नहीं। –

+0

@ एमआर। चमकदार और नया: हाँ, System.out.println ("š" .toCharArray() लंबाई); आउटपुट '2' – ManBugra

0

मैं एक साधारण पाश में replace विधि का उपयोग करें चाहते हैं।

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

प्रत्येक पुनरावृत्ति एक नई स्ट्रिंग ऑब्जेक्ट तैयार करेगी।इसे 'जगह में' करना अच्छा लगेगा – ManBugra

+0

सबसे पहले, प्रत्येक पुनरावृत्ति केवल एक नया ऑब्जेक्ट बनाता है यदि कोई परिवर्तन किया जाता है; यदि चरित्र की खोज की जा रही है, तो मूल वस्तु वापस आती है। दूसरा, यह 'स्ट्रिंगबिल्डर' या 'स्ट्रिंगबफर' का उपयोग करके इस कोड को लिखने के लिए * बहुत अधिक परेशान है क्योंकि आपको अपने सभी काम स्वयं करना है; चूंकि जावा के मेमोरी मैनेजमेंट को वैसे भी तेजी से ऑब्जेक्ट टर्नओवर के लिए ट्यून किया जाता है, इसलिए इसे प्रभावी तरीके से समझने की कोशिश करने के बजाए मैंने इसे दिखाया है। यदि आवश्यक हो तो आप हमेशा बाद में अनुकूलित कर सकते हैं (यानी, यदि यह वास्तविक बाधा है)। –

+0

हाँ आप अपने पहले बिंदु पर सही हैं। लेकिन मैं आपके दूसरे से सहमत नहीं हूं। आप एक बार कुशल कोड लिखते हैं, यहां तक ​​कि यह कष्टप्रद है, और इसे पुन: उपयोग करने से पहले। वैसे भी बलुस ने पहेली हल की। – ManBugra

संबंधित मुद्दे