【问题标题】:How to change chars between 2 strings?如何在两个字符串之间更改字符?
【发布时间】:2020-06-02 10:34:25
【问题描述】:

我想把一个字符串中的一个字符换成第二个字符串中的另一个字符,距离是3。

例如:
字符串 s1:abc, 字符串 s2:abcdef->s2 将是 abadef 然后 -> abadeb。

如果可能的话,第一个字符串中的所有字符都应该转到第二个 s2。不得不提的是,第一个字符串的大写字母应该是小写字母,并且只有字母会从第一个字符串中取出。我知道字符串是不可变的

public static void Encrypt(String s1, String s2) {
        s1 = s1.toLowerCase();
        StringBuilder finalS2 = new StringBuilder();
        finalS2.append(s2);

        for (int i = 0; i < finalS2.length(); i++) {

            if (s1.charAt(i) >= 'a' && s1.charAt(i) <= 'z') {

                finalS2.setCharAt(i + 2, s1.charAt(0));

                break;
            }
        }

        System.out.println(finalS2);
    }

我认为在我的方法中,我认为这不是一个好主意,我应该为 s1 放置另一个 for 循环并在某处放置一个 break。我尝试了很多方法,charArray等,但没有成功。

【问题讨论】:

  • 你能更好地解释你需要什么吗?这个问题不清楚(对我来说)。
  • 假设我有 2 个字符串是用户输入的。第一个字符串是:“car”,第二个是“restaurant”,我想在 3 位置获得 'c',所以它将是:“rectaurant”,然后在 6 位置获得 'a',所以它将是“rectaarant”和 'r ' 如果可能的话,在 9 上

标签: java string char


【解决方案1】:

所以你想取s2 的原始文本并将每三个字符替换为s1 中的字符:

s1: abc
    ││└───── ignored
    │└───┐
    └─┐  │
s2: abcdef

像这样进行增量单字符替换的最佳方法是获取原始字符串 (s2) 的 char[],替换适当的字符,然后从中构建结果字符串。

public static String encrypt(String s1, String s2) {
    char[] buf = s2.toCharArray();
    for (int i = 0, j = 2; i < s1.length() && j < buf.length; i++, j += 3) {
        buf[j] = Character.toLowerCase(s1.charAt(i));
    }
    return new String(buf);
}

测试

System.out.println(encrypt("abc", "abcdef"));

输出

abadeb

如果您希望代码处理来自 Unicode 补充平面的字符,例如表情符号,那么您需要使用代码点。

您还提到您只需要来自s1 的信件,所以我们会将其添加到下一个版本中codePoints() 需要 Java 9+)

public static String encrypt(String s1, String s2) {
    int[] c1 = s1.codePoints().toArray();
    int[] c2 = s2.codePoints().toArray();
    for (int i = 0, j = 2; i < c1.length && j < c2.length; i++) {
        if (Character.isLetter(c1[i])) {
            c2[j] = Character.toLowerCase(c1[i]);
            j += 3;
        }
    }
    return new String(c2, 0, c2.length);
}

测试

System.out.println(encrypt("abc", "abcdef"));
System.out.println(encrypt("a?c?e", "a?c?e?g?i?k?m?"));

输出

abadeb
a?a?ecg?e?k?m?

如您所见,s1 中的表情符号字符被跳过,因为它们不是“字母”,s2 中的表情符号被正确替换。尽管?s2 中占据了2 个char 位置,但它被c 替换是正确的,一个char 值。

【讨论】:

  • 到目前为止我还没有想到 emoji,但我测试了您的解决方案并且它正在工作。您的解决方案很好且易于理解。感谢您抽出宝贵的时间。
  • 题外话:你是如何在第一个代码块中画线的?
  • @user7 网络搜索unicode box drawing,选择Box-drawing character - Wikipedia链接,选择/滚动到Unicode部分,然后复制/粘贴相关字符。
  • 您可以只指定最后一个链接以节省时间;)
  • 当然。同意。但我会(也期待其他人)环顾(wiki)页面并了解它可用于绘制任何此类 unicode 点。好奇地学习一般原则并将其扩展并在未来应用:)
【解决方案2】:

如果我理解正确,这应该可以。在您的示例中,everyX 为 3

public static String encrypt(String s1, String s2, int everyX) {
    //Start with S2
    StringBuilder finalS2 = new StringBuilder(s2);
    s1 = s1.toLowerCase();

    int indexInS1 = 0;
    //Whilst there are characters in S2 and S1 left to iterate over
    for (int placeInS2 = 0; placeInS2 < finalS2.length() && indexInS1 < s1.length(); placeInS2++) {
         //Has there been everyX places encountered and the character in S1 is alphanumeric
        if ((placeInS2 + 1) % everyX == 0) {
            if (Character.isAlphabetic(s1.charAt(indexInS1)) {
                finalS2.setCharAt(placeInS2, s1.charAt(indexInS1));
            }
            indexInS1++;
        }
    }

    return finalS2.toString();
}

【讨论】:

  • 你理解得很好,谢谢,我测试了几次,来自 s1 的最后一个字符没有进入 s2。但我想我会从这里找到方法。谢谢
  • 我已经更改了 (s1.length() - 1)。我还删除了 count 变量
  • 它正在工作,谢谢,我标记了答案。即使是简单的问题也有很好的反馈:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多