我试图制作一个加密器。我想要它做什么:
获取我输入的文字并翻转每个单词的前两个字母 然后再次显示它。
我尝试了很多方法。这是我尝试的最后一个:
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 :(得分: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)
有一些问题。
zz
。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+
)字符进行拆分,但仅使用空格" "
替换它。这可能会改变带有特殊字符的字符串。 答案 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);