我正在编写此程序以使用重复序列对消息进行编码。我相信我正确地得到了编码过程。在print for循环之前使用toString语句给出了正确的值,但是当我尝试在最后运行for循环时,它不会打印列表中的每个元素。例如,当我输入“你好”时,我会回到“Igo”而不是预期的“Igopt”。我能想到的唯一一件事是,当我运行for循环时,我的编码List以某种方式缩小了,但是我创建了一个新的LinkedList打印,这样我就不会影响编码的List,所以我不确定为什么它不是'正确打印。
import java.util.*;
public class Encode {
public static void main(String[] args) {
Encode enc = new Encode();
System.out.println("Please Enter String to Decode");
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
System.out.println("Encoded: " + enc.Encode(str));
}
public String Encode(String toEncode) {
Queue key = new LinkedList(); // creates a key and adds the key values
Queue clone = new LinkedList();
key.add(1);
key.add(2);
key.add(3);
key.add(4);
key.add(5);
LinkedList encoded = new LinkedList(); // creates a list for the encoded
LinkedList print = new LinkedList();
print = encoded; // values
int ascii; // ascii value of the character
int keyValue; // int value of the key to add to the ascii and encode the
// characters
char result; // sum of int values of the character and the key
String s = ""; // initializes the String used for return value
for (int i = 0; i < toEncode.length(); i++) {
clone = key;
char myChar = toEncode.charAt(i); // gets character at i
ascii = (int) myChar; // converts character at i to an int value
if (ascii == 32) { // ignores spaces
continue;
}
else { // if character is not a space
keyValue = (int) clone.remove();
result = (char) (ascii + keyValue);
encoded.add(result);
clone.add(keyValue);
}
}
System.out.println(encoded.toString()); // testing to see if encoded
// properly *remove after
// prints the elements of the encoded List
for (int j = 0; j < encoded.size(); j++) {
s = s + print.remove(); // gets the first value and concatenates
// it to the string
}
return s;
}
}
答案 0 :(得分:2)
我唯一能想到的是,当我运行for循环时,我的编码List会以某种方式缩小,但是我创建了一个新的LinkedList打印,这样我就不会影响编码列表了,所以我不确定确切地说,为什么它没有正确打印。
这正是发生的事情。
您的LinkedList print
根本不保护任何内容,因为它只是对同一列表的另一个引用,而您执行的删除会影响原始列表。
要使其具有相同元素的不同列表,您可以使用
创建它 LinkedList print = new LinkedList(encoded);
答案 1 :(得分:1)
您遇到的问题称为aliasing,主要是通过设置
print = encoded
您要将两个列表指针设置为彼此相等。在java中,这意味着当您更改一个列表时,另一个列表会更改。
答案 2 :(得分:0)
将for-loop
的所有内容更改为while-loop
while(!print.isEmpty()){
s=s+print.remove();
}
我正在调查为什么for-loop
没有工作