显示相同文本并反转两个字母的函数

时间:2015-08-03 11:57:13

标签: java arrays algorithm encryption

我试图制作一个加密器。我想要它做什么:

  

获取我输入的文字并翻转每个单词的前两个字母   然后再次显示它。

我尝试了很多方法。这是我尝试的最后一个:

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

5 个答案:

答案 0 :(得分: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 :(得分: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.

答案 2 :(得分:1)

有一些问题。

  1. 如果您想在外面使用它,请在循环外声明zz
  2. 在每次迭代时附加 zz。不只是分配
  3. 像这样,

     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 + " ");      
        }
    
    1. 您正在使用非单词(\W+)字符进行拆分,但仅使用空格" "替换它。这可能会改变带有特殊字符的字符串。

答案 3 :(得分:0)

在Java中,字符串是不可变的。您无法动态修改它们#34;您需要将它们重新分配给新实例。

此外,您将最后一个显示文本设置为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)你的分裂逻辑是正确的。你能想到你的正则表达式失败的边缘情况吗?

答案 4 :(得分: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);