Как изменить символы между двумя строками? - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу изменить символ в строке с другим во второй строке, расстояние равно 3. Например, строка s1: ab c, строка 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);
    }

Я думаю, что в моем методе, который я не думаю, что это хорошая идея, я должен поместить другое для l oop для s1 и перерыва где-нибудь. Я пробовал много методов, с charArray, et c, но не сделал т удалось.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Таким образом, вы хотите взять исходный текст s2 и заменить каждый третий символ символами из s1:

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

Лучший способ сделать инкрементные замены с одним символом, как это получить char[] исходной строки (s2), замените соответствующие символы, затем построите результирующую строку из этого.

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

Test

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

Вывод

abadeb

Если вы хотите, чтобы код обрабатывал символы из дополнительных плоскостей Юникода, например, эмодзи, то вам нужно работать с кодовыми точками.

Вы также упомянули, что вам нужны только буквы от 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 правильно заменены. Даже если ? занимает 2 char позиции в s2, оно корректно заменяется на c, единственное значение char.

1 голос
/ 18 февраля 2020

Если я правильно понял, это должно сработать. 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...