2015-08-03 46 views
-2

我試圖做一個encryptor.What我想要它做的一個函數:展示帶有兩個字母相同的文字顛倒

得到我輸入的文本和反向每個單詞的前兩個字母 然後再次顯示。

我已經嘗試了很多ways.This的是最後一個我已經試過:

private void TranslateToEf(){ 
     String storage = Display.getText(); 
     String[] arr = storage.split("\\W+"); 

     for (String ss : arr) { 

      char c[] = ss.toCharArray(); 
      char temp = c[0]; 
      c[0] = c[1]; 
      c[1] = temp; 
      String swappedString = new String(c); 
      Display.appendText(swappedString + " ");  
     }  
    } 
+0

先後這種方法有效? – drgPP

+0

No.It顯示空白。但許多方法只與第一個字。 – AlexSS

+0

你可以發佈一個示例輸入和輸出? – Carsten

回答

3

您可能需要更多的幫助考慮保留從第一個String.split("\\W+")丟失的所有分隔符,以便將它們包括在最終結果中。我會用String.split("\\w+")

你可能還想考慮一下,當你交換前兩個字母時,如果第一個字母是大寫,它會變成小寫字母,第二個字母變成大寫字母。否則,只要做一個直接交換。

代碼示例:

public static void main(String[] args) throws Exception { 
    String data = "Hello;World! My name is John. I write code."; 
    String[] words = data.split("\\W+"); 
    String[] delimiters = data.split("\\w+"); 
    int delimiterIndex = 0; 

    StringBuilder sb = new StringBuilder(); 
    for (String word : words) { 
     if (word.length() < 2) { 
      sb.append(word); 
     } else { 
      char firstLetter = word.charAt(0); 
      char secondLetter = word.charAt(1); 
      if (Character.isUpperCase(firstLetter)) { 
       // Swap the first two letters and change casing 
       sb.append(Character.toUpperCase(secondLetter)) 
         .append(Character.toLowerCase(firstLetter)); 
      } else { 
       // Swap the first two letters 
       sb.append(secondLetter) 
         .append(firstLetter); 
      } 
      // Append the rest of the word past the first two letters 
      sb.append(word.substring(2)); 
     } 

     // Append delimiters 
     if (delimiterIndex < delimiters.length) { 
      // Skip blank delimiters if there are any 
      while (delimiters[delimiterIndex].isEmpty()) { 
       delimiterIndex++; 
      } 
      // Append delimiter 
      sb.append(delimiters[delimiterIndex++]); 
     } 
    } 
    data = sb.toString(); 

    // Display result 
    System.out.println(data); 
} 

結果:

Ehllo;Owrld! Ym anme si Ojhn. I rwite ocde. 
1

有幾個問題。

  1. 聲明zz如果你想在外面使用它,
  2. 在每次迭代時附加zz。不只是轉讓它。

這樣的事情,

private void TranslateToEf(){ 
     String storage = Display.getText(); 
     String[] arr = storage.split("\\W+"); 
     String zz = ""; 

     for (String ss : arr) { 

      char c[] = ss.toCharArray(); 
      char temp = c[0]; 
      c[0] = c[1]; 
      c[1] = temp; 
      String swappedString = new String(c); 
      String b= " "; 
      zz += swappedString + b;  
     } 
     Display.setText(zz + " ");  
    } 
  • 您正在與非字(\W+)字符分割,而只用一個空間" "取代它。這可能會改變具有特殊字符的字符串。
  • 0

    在Java中,字符串是不可變的。您無法在「即時」修改它們,您需要將它們重新分配給新實例。

    此外,您將最後一個顯示文本設置爲zz,但zz是循環的局部變量,因此每次迭代都會重新實例化它。換句話說,你將分配只顯示最後一個字!

    這裏是你必須做的,使其工作是什麼:

    String storage = Display.getText(); 
    String[] arr = storage.split("\\W+"); 
    String[] newText = new String[arr.length]; 
    for (int i = 0; i<arr.length; i++) { 
        String original = arr[i]; 
        String modified = ((char) original.charAt(1)) + ((char) original.charAt(0)) + original.substring(2); 
        newText[i] = modified; 
    } 
    //Join with spaces 
    String modifiedText = Arrays.asList(newText).stream().collect(Collectors.join(" ")); 
    Display.setText(modifiedText); 
    

    需要注意的是: 1)我們假設所有字符串至少有2個字符 2)你的分裂的邏輯是正確的。你認爲你的正則表達式失敗了嗎?

    +0

    不行.http://gyazo.com/c2b6867100f6ac7cce59ae61ca8545b9 – AlexSS

    +0

    @亞歷山大忘了投了個字。現在修復 –

    0

    不知道你正在尋找什麼,但我在你的代碼稍加修改看看是否適合您的需要

    String storage = "Test test t"; 
        String[] arr = storage.split("\\W+"); 
    
        String abc = ""; 
        for (String ss : arr) { 
    
         if(ss.length() > 1) 
         { 
          char c[] = ss.toCharArray(); 
          char temp = c[0]; 
          c[0] = c[1]; 
          c[1] = temp; 
          String swappedString = new String(c); 
          String b = " "; 
          String zz = swappedString + b; 
          abc = abc + zz; 
         }else{ 
          abc = abc + ss; 
         } 
        } 
        System.out.println(abc); 
    
    3
    public class Encrypto { 
    
    
        public static void main(String[] args) { 
         String input="Hello World"; 
    
         String [] word = input.split(" "); 
        // System.out.println(word[0]); 
         String encryWord=""; 
    
         for(int i=0;i<word.length;i++){ 
    
          if (word[i].length() > 0) { 
           String tmp0 = String.valueOf(word[i].charAt(1)); 
           String tmp1 = String.valueOf(word[i].charAt(0)); 
    
           encryWord += tmp0.toLowerCase() + tmp1.toLowerCase() + word[i].substring(2) + " "; 
          }else{ 
           encryWord +=word[i]; 
         } 
    
    
    
         } 
         System.out.println(encryWord); 
        } 
    
    } 
    

    我認爲答案是你

    +1

    如果一個單詞只有1個字符會發生什麼? – Shar1er80

    +0

    @ Shar1er80給出錯誤,但我們可以檢查條件字[i] .length> 0如果條件爲true給出其他語句給出錯誤信息 –

    +1

    爲什麼要給出錯誤?只要處理這種情況,不要對1個字符的單詞進行任何交換。 – Shar1er80