我正在完成一项任务,而这一部分正在绊倒我。
构造cipher1 首先使用第一个键中的唯一字母填充矩阵。
例如,如果密钥为“testkey”
,则使用字母 T,E,S,K,Y 填写密钥。
不要从键中填写重复的字符。然后用字母表中的剩余字符填充矩阵(再次,跳过Q)。
不要重复按键中出现的任何字符。因此,对于“testkey”, cipher1 如下所示:“
密码是 5 x 5 数组,通常填充字母表中的字母减去'q'。
因此,如果我的密钥是testkey,则密码现在将填充"TESKYABCDFGHIJLMNOPRUVWXZ" instead of "ABCDEFGHIJKLMNOPRSTUVWXYZ".
我认为这样的事情会起作用,但事实并非如此。
for (int i = 0; i < key.length(); i++)
{
key.toCharArray();
alphabet.replace(key[i], "");
}
键变量是字符串“TESTKEY”,字母变量也是包含“ABCDEFGHIJKLMNOPRSTUVWXYZ”的字符串。
现在看着代码明显存在缺陷,现在我只是卡住了。请任何人向我提出建议
答案 0 :(得分:1)
试试这个:
public static void main(String[] args) {
String testS = "testkey";
String key = "ABCDEFGHIJKLMNOPRSTUVWXYZ";
testS = testS.toUpperCase() + key;
testS = removeDuplicates(testS);
System.out.println(testS);
}
static String removeDuplicates(String string) {
StringBuilder noDuplicateChars = new StringBuilder();
for (int i = 0; i < string.length(); i++) {
String letter = string.substring(i, i + 1);
if (noDuplicateChars.indexOf(letter) == -1) {
noDuplicateChars.append(letter);
}
}
return noDuplicateChars.toString();
}
如果由于某种原因您不想使用StringBuilder
,您可以将removeDuplicates
的实施更改为:
static String removeDuplicates(String string) {
String noDuplicates = new String("");
for (int i = 0; i < string.length(); i++) {
if (!noDuplicates.contains("" + string.charAt(i))) {
noDuplicates += "" + string.charAt(i);
}
}
return noDuplicates;
}
答案 1 :(得分:0)
您可以使用LinkedHashSet。在for循环中添加class Arms {
constructor() {}
}
class Legs {
constructor() {}
}
class Human {
constructor() {
this.arms = Human.Arms();
this.legs = Human.Legs();
}
static Arms() {
return new Arms();
}
static Legs() {
return new Legs();
}
}
个字符,在第二个循环中添加key
个字符。然后遍历set元素并构建字符串。
请注意,如果元素已存在于集合中,则方法alphabet
不会放置元素,因此不需要进行其他检查。
答案 2 :(得分:-1)
你只需要使用正则表达式;
示例:1 - 键
input: testkey
code: `String newString = input.replaceAll("(.)\\1{1,}", "$1").toUpperCase();`
output: TESKY
例2;带有alphapatical字符串的Concat newString
input: testkey + "ABCDEFGHIJKLMNOPRSTUVWXYZ";
code: `String FinalString = input.replaceAll("(.)\\1{1,}", "$1").toUpperCase();`
output: TESKYABCDFGHIJLMNOPRUVWXZ