我正在尝试从终端读取输入。为此,我使用的是BufferedReader。这是我的代码。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] args;
do {
System.out.println(stateManager.currentState().toString());
System.out.print("> ");
args = reader.readLine().split(" ");
// user inputs "Hello World"
} while (args[0].equals(""));
我的代码中的其他地方我有一个HashTable
,其中Key和Values都是字符串。这是问题所在:
如果我想从HashTable
获取一个值,我在HashTable
中使用的密钥是其中一个args元素。这些args很奇怪。如果用户输入两个参数(第一个是命令,第二个是用户想要查找的参数),我找不到匹配。
例如,如果HashTable包含以下值:
[ {"Hello":"World"}, {"One":"1"}, {"Two":"2"} ]
并且用户输入:
get Hello
我的代码不会返回"World"
。
所以我使用调试器(使用Eclipse)来查看args
内部的内容。我发现args[1]
包含"Hello"
,但在args[1]
内,有一个名为value
的字段,其值为['g','e','t',' ','H','e','l','l','o']
。
args[0]
也是如此。它包含"get"
,但字段value
包含['g','e','t',' ','H','e','l','l','o']
!
到底是什么!!!
但是,如果我检查HashTable
,只要密钥为"Hello"
,则值为['H','e','l','l','o']
。
有什么想法吗?
非常感谢。
编辑:
这是代码示例。同样的事情仍在发生。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;
public class InputTest
{
public static void main(String[] args)
{
BufferedReader reader = new BufferedReader(new InputStreamReader( System.in));
Hashtable<String, String> EngToSpa = new Hashtable<String, String>();
// Adding some elements to the Eng-Spa dictionary
EngToSpa.put("Hello", "Hola");
EngToSpa.put("Science", "Ciencia");
EngToSpa.put("Red", "Rojo");
// Reads input. We are interested in everything after the first argument
do
{
System.out.print("> ");
try
{
args = reader.readLine().trim().split("\\s");
} catch (IOException e)
{
e.printStackTrace();
}
} while (args[0].equals("") || args.length < 2);
// ^ We don't want empty input or less than 2 args.
// Lets go get something in the dictionary
System.out.println("Testing arguments");
if (!EngToSpa.contains(args[1]))
System.out.println("Word not found!");
else
System.out.println(EngToSpa.get(args[1]));
// Now we are testing the word "Hello" directly
System.out.println("Testing 'Hello'");
if (!EngToSpa.contains("Hello"))
System.out.println("Word not found!");
else
System.out.println(EngToSpa.get("Hello"));
}
}
同样的事情仍在发生。我一定是误解哈希表。事情出错的想法?
答案 0 :(得分:1)
不要担心值字段 - 这只是说有一个包含“get Hello”文本的char数组,而args [0]和args [1] 都引用 char数组,但它们会有不同的偏移和计数。 args [0]的偏移量为0,计数为3; args [1]的偏移量为4,计数为5。
我不知道为什么你的哈希映射不起作用...你能提供一个简短但完整的示例程序吗?
答案 1 :(得分:1)
我刚注意到我的错误。我必须使用 containsKey()而不是 contains()。
我要感谢大家的帮助。
作为奖励,我还了解了“价值”领域是什么。太好了!
答案 2 :(得分:0)
正如Jon所说,你刚刚看到Java中String
的内部实现的工件。您可以忽略value
字段用于您的目的。这与事情不适合你的原因无关。您需要向我们展示不起作用的代码部分。