Таким образом, вы хотите взять исходный текст 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
.