Java - 基于旧字符串和滞后创建新字符串

时间:2014-10-25 08:12:59

标签: java string replace char

我需要根据旧字符串和滞后来获取新字符串。基本上,我有一个字母表的字符串(s =" abc ... xyz")并且基于滞后(即3),新字符串应该替换我输入的字符串中的字符放置一些位置(滞后)。如果,让我们说,我输入" cde"作为我的字符串,输出应该是" fgh"。如果在字符串中添加了任何其他字符(除了空格 - ""),则应将其删除。这是我尝试过的,但它不起作用:

String code = "abcdefghijklmnopqrstuvwxyzabcd";  //my lag is 4 and I added the first 4 characters to 
char old;                                        //avoid OutOfRange issues   
char nou;
for (int i = 0; i < code.length() - lag; ++i)
{
   old = code.charAt(i);
   //System.out.print(old + " ");
   nou = code.charAt(i + lag);
   //System.out.println(nou + " ");
   //   if (s.indexOf(old) != 0)
   //   {
            s = s.replace(old, nou);
   //   }
}

我评论了old和nou的输出(new,但是保留字),因为我只用它来测试从位置i到i + lag的代码是否正常工作(并且它是),但如果我取消注释如果声明,它没有做任何事情,我就这样离开它,它继续执行fors statmement for code.length()次内的指令,但我的字符串不需要这么长时间。我也尝试过如下所示的for语句,但我迷路了。

for (int i = 0; i < s.length(); ++i)
{
  ....
}
你可以帮我这个吗?或者可能有一些关于如何思考算法的建议?

谢谢!

4 个答案:

答案 0 :(得分:3)

它不起作用,因为javadoc of replace()说:

  

返回一个新字符串,该字符串是使用newChar替换此字符串中oldChar的所有次出现所产生的。

(强调我的)

因此,当您第一次在字符串中遇到'a'时,您将'a'替换为 all 'a'。但是你去了下一个字符,如果之前的'd'是'a',你可以再次替换它等等。

你根本不应该使用replace()。相反,您应该使用StringBuilder构建一个新字符串,方法是附加原始字符串的每个移位字符:

String dictionary = "abcdefghijklmnopqrstuvwxyz";
StringBuilder sb = new StringBuilder(input.length());
for (int i = 0; i < input.length(); i++) {
    char oldChar = input.charAt(i);
    int oldCharPositionInDictionary = dictionary.indexOf(oldChar);
    if (oldCharPositionInDictionary >= 0) {
        int newCharPositionInDictionary = 
            (oldCharPositionInDictionary + lag) % dictionary.length();
        sb.append(dictionary.charAt(newCharPositionInDictionary));
    }
    else if (oldChar == ' ') {
        sb.append(' ');
    }
}
String result = sb.toString();

答案 1 :(得分:1)

试试这个:

  1. 将字符串转换为char数组。
  2. 遍历每个char数组并通过添加lag
  3. 来更改char
  4. 使用新的String传递char数组创建一个新的String(而不是循环)。

    String code = "abcdefghijklmnopqrstuvwxyzabcd";  
    String s = "abcdef";
    char[] ch = s.toCharArray();
    char[] codes = code.toCharArray();
    for (int i = 0; i < ch.length; ++i)
    {
      ch[i] = codes[ch[i] - 'a' + 3];
    }
    
    String  str = new String(ch);
    System.out.println(str);
    }
    

答案 2 :(得分:0)

String alpha = "abcdefghijklmnopqrstuvwxyzabcd"; // alphabet
int N = alpha.length();
int lag = 3; // shift value

String s = "cde"; // input


StringBuilder sb = new StringBuilder();
for (int i = 0, index; i < s.length(); i++) {
    index = s.charAt(i) - 'a';
    sb.append(alpha.charAt((index + lag) % N));
}
String op = sb.toString(); // output

答案 3 :(得分:0)

我的回答是这样的。

它为每个字符返回一个索引。

它会反转每个字符串。

祝你有个美好的一天!

package org.owls.sof;

import java.util.Scanner;

public class Main {
    private static final String CODE = "abcdefghijklmnopqrstuvwxyz";  //my lag is 4 and I added the first 4 characters to 

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        System.out.print("insert alphabet >> ");
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        char[] char_arr = s.toCharArray();

        for(int i = 0; i < char_arr.length; i++){
            int order = CODE.indexOf(char_arr[i]) + 1;
            if(order%CODE.length() == 0){
                char_arr[i] = CODE.charAt(0);
            }else{
                char_arr[i] = CODE.charAt(order); 
            }
        }
        System.out.println(new String(char_arr));
        //reverse
        System.out.println(reverse(new String(char_arr)));

    }

    private static String reverse (String str) {
        char[] char_arr = str.toCharArray(); 
        for(int i = 0; i < char_arr.length/2; i++){
            char tmp = char_arr[i];
            char_arr[i] = char_arr[char_arr.length - i - 1];
            char_arr[char_arr.length - i - 1] = tmp;
        }
        return new String(char_arr);
    }
}