2017-03-05 3 views
-3

こんにちは私はStringのスペースを%20に置き換えようとしています。 例 入力:ミスターA 出力:ミスター%の20AJava:スペースを%20に置き換えてください。なぜ%20 AのMrと%20Aを印刷しないのですか

私のコードが印刷 "ミスター20%A" である理由私は理解できません。私は "Mr.%20A"を印刷したいので、どうすればそれをやるのですか?あなたは(c == ' 'の場合)"%20"を追加した後、あなたもcを追加

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class TestAnswer { 



    public static void main(String[] args) { 
     //System.out.println(isPermutation("aXbcx", "xbcaX")); 
     System.out.println(URLify("Mr A")); 
    } 


    static String URLify(String s){ 
     StringBuilder sb = new StringBuilder(); 
     for(int i = 0; i < s.length(); i++){ 
      char c = s.charAt(i); 
      if(c == ' '){ 
       sb.append("%20"); 

      } 

      sb.append(c); 

     } 

     return sb.toString(); 
    } 

} 
+2

単に 's.replace(」」、 "%20")'をしないのはなぜ '他に' 何それは –

+0

だろうか? – QBrute

+0

なぜ[URLEncoder#encode](https://docs.oracle.com)を使用しないでください。com/javase/7/docs/api/java/net/URLEncoder.html) – sudo

答えて

4

:ここに私のコードです

char c = s.charAt(i); 
if(c == ' '){ 
    sb.append("%20"); 
} 
sb.append(c); //here 

解決策は、それが' 'がない場合にのみcを追加することです。

ソリューション:

char c = s.charAt(i); 
if(c == ' '){ 
    sb.append("%20"); 
}else{ 
    sb.append(c); 
} 
5

代わりのStringをループとStringBuilderを使用して、それを再作成、コードのこの一行を使用することを検討してください:

s = s.replace(" ", "%20"); 
0

//System.out.println(isPermutation("aXbcx", "xbcaX")); 
をコメントアウトすることで

私は、私はちょうど十分であるかもしれないよりよい解決策に

あなたのソリューションを提案したいあなたは

@sudoは、あなたの質問に答えCTCIを解決している見ることができますが、StringBuilder.appendがcharを倍増することを説明する価値があります容量が十分でない場合、それは文字列を保持できるようになるまで、それぞれの文字列が含まれています配列サイズは、追加

返されるchar配列

private static char[] URLify(char[] original) { 
    char charToReplace = ' '; 
    char[] replacement = new char[]{'%', '2', '0'}; 
    // count charToReplace, in our case, count spaces 
    int numCharsToReplace = 0; 
    for (char c : original) if (c == charToReplace) numCharsToReplace++; 
    // creating new fixed char array to return 
    int resultSize = original.length + (numCharsToReplace * replacement.length) - numCharsToReplace; 
    char[] result = new char[resultSize]; 
    // we need two indexes,one to iterate the result char array, second to iterate the original 
    int i = 0, originalIdx = 0; 
    // until we set all new array of chars cells 
    while (i < resultSize) { 
     // get original character 
     char curOriginalChar = original[originalIdx]; 
     // this condition is first because I assume real URL will not contain as much spaces as chars 
     // if current character is not one we need to replace, copy 
     if (curOriginalChar != charToReplace) { 
      result[i] = curOriginalChar; 
      // for readable code the index incremented in new line 
      // could be replaced with "result[i++] = curOriginalChar;" 
      i++; 
     } 
     else { 
      for (char c : replacement) { 
       result[i] = c; 
       i++; 
      } 
     } 
     originalIdx++; 
    } 
    return result; 
} 
に拡大しませんが、元の文字列の上に二回繰り返されます私のソリューション

ユーティリティ使用例に

/** 
* StringBuilder's member "char value[]" is the character array stored inside StringBuilder, and it's 
* reference can be accessed only through getValue method, which is not public 
* so a little hack so we can know what is the char array size created 
*/ 
private static int getStringBuilderCharSize(StringBuilder sb) throws NoSuchFieldException, IllegalAccessException { 
    Field stringBuilderCharField = StringBuilder.class.getSuperclass().getDeclaredField("value"); 
    stringBuilderCharField.setAccessible(true); 
    char[] chars = (char[]) stringBuilderCharField.get(sb); 
    return chars.length; 
} 

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { 
     String original = "Mr & Mrs Smith"; 
     char[] urlify = URLify(original.toCharArray()); 
     System.out.println(new String(urlify) + "|" + urlify.length); 

     StringBuilder sb = new StringBuilder(); 
     for (char c : original.toCharArray()) 
      if (c != ' ') sb.append(c); 
      else sb.append("%20"); 
     System.out.println(sb.toString() + "|" + getStringBuilderCharSize(sb)); 
    } 

出力のStringBuilder実際のchar配列の長さを得るために:保存

Mr%20&%20Mrs%20Smith|20 
Mr%20&%20Mrs%20Smith|34 

14細胞;)

0

あなたのコードでは、あなたがチェックしています文字がスペースで、 "%20"をStringBuilderに追加する場合。しかし、if条件の後のsb.append(c)ステートメントは、スペースも追加されます。 ifの中に "%20"を追加した後にcontinueキーワードを追加できます。

だからあなたのコードは次のようになります。

static String URLify(String s){ 
     StringBuilder sb = new StringBuilder(); 
     for(int i = 0; i < s.length(); i++){ 
      char c = s.charAt(i); 
      if(c == ' '){ 
       sb.append("%20"); 
       continue; 
      } 

      sb.append(c); 

     } 

     return sb.toString(); 
    } 
関連する問題