我需要根据旧字符串和滞后来获取新字符串。基本上,我有一个字母表的字符串(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)
{
....
}
你可以帮我这个吗?或者可能有一些关于如何思考算法的建议?
谢谢!
答案 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)
试试这个:
使用新的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);
}
}