2015-08-03 42 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