我是初学者,所以请不要爆炸我的工作到目前为止:) 我正在尝试读取CSV文件,然后查看它是否与某些命令匹配。 CSV中的某些数据有一段时间,我认为当我试图拆分它时它会搞乱。当我尝试转储我的阵列以查看其中的内容时,它总是在这段时间后被切断。这是一个数据样本。任何帮助,将不胜感激。我再次成为初学者,所以简单易懂。
示例数据
create,Mr. Jones,blah,blah create,Mrs. Smith,blah,blah
public class TestHarness {
public static void main(String[] args) throws IOException, FileNotFoundException {
Scanner input = new Scanner(new File("C:\\Users\\Ree\\Desktop\\SPR\\commands.txt"));
String[] validCommands = { "create", "move", "useWeapon", "search", "heal" };
boolean proceed = false;
while (!proceed)
{
for (int i = 0; i < validCommands.length; i++)
{
String line = input.next();
String[] nline = line.split (",");
if (nline[0].equals("create"))
{
String soldierName = nline[1];
String soldierType = nline[2];
String weapon = nline[3];
Soldier aSoldier = new Soldier(soldierName,weapon);
System.out.println("Command: "+ nline[0] +","+ soldierName +","+ soldierType+","+ weapon);
if (soldierType.equals("enlisted"))
{
Soldier s = new Enlisted(soldierName,weapon);
System.out.println(s.toString());
}
else if (soldierType.equals("officer"))
{
Soldier s = new Officer(soldierName,weapon);
System.out.println(s.toString());
}
}
else if (nline[0].equals("useWeapon")) {
System.out.print("weapon " + nline[0] + "\n");
}
else if (nline[0].equals("move")) {
System.out.print("move " + nline[0] + "\n");
}
else if (nline[0].equals("search")) {
System.out.print("search " + nline[0] + "\n");
}
else if (nline[0].equals("heal")) {
System.out.print("heal " + nline[0] + "\n");
}
}
}
}
}
答案 0 :(得分:2)
调用Scanner.next
只会返回下一个单词(以空格分隔)。
您需要调用nextLine
一次读取整行。
答案 1 :(得分:1)
有几种可用于Java的开源CSV parers:
答案 2 :(得分:0)
这是一个相当快速的错误,不是吗?
这不是您的问题的答案,而是建议使用哈希。 首先定义一个接口
public interface InputDance
{
public void dance(String[] input);
}
我建议您的主要例程
public static void main(String[] args)
throws IOException, FileNotFoundException{
Scanner input = new Scanner(
new File("C:\\Users\\Ree\\Desktop\\SPR\\commands.txt"));
String line = input.nextLine();
String[] nline = line.split (",");
InputDance inputxn = inputActions.get(nline[0]);
if (inputxn!=null)
inputxn.dance(nline);
}
您将使用哈希来存储InputDance接口概述的所有操作。
这样您的输入阅读程序就会简化为
如果你只有五种类型的士兵,你可以将所有逻辑放在一个例程中。 但是,对于超过10种类型的人员,将行动置于例行程序之外会更加清晰。
如果您正在编写计算机游戏,或者将人事记录保存在军事数据库中,您会经常遇到增强请求,以包括规则的新人员类型或例外。那么你的if-then-else-if链会变得越来越长,令人困惑。特别是当士兵们对不同的曲调跳舞时有特殊要求。或者当您的游戏画布或人员数据库需要包含非战斗单位时。但是,当然,每次有新的人员类型时,您仍需要更新主类中的哈希值。
请注意,在我的推荐中,您所做的所有例程都是执行dance(String [])方法。任何复杂情况都将由实施舞蹈的个别班级处理。
接下来定义一个实现类
public class SoldierDance
implements InputDance
{
public void dance(String[] nline){
String soldierName = nline[1];
String soldierType = nline[2];
String weapon = nline[3];
System.out.println(
"Command: "+ nline[0] +","+ soldierName +","+ soldierType+","+ weapon);
Soldier s;
if (soldierType.equals("enlisted")){
s = new Enlisted(soldierName,weapon);
}
else if (soldierType.equals("officer")){
s = new Officer(soldierName,weapon);
}
else{
s = new Soldier(soldierName,weapon);
}
System.out.println(s.toString());
}
}
然后定义你的主类。请注意,哈希是一个静态实例。
另外,有一个占位符舞蹈,所以当你有一个新的人员类型,但你不知道该怎么做它,你只需将新的人员类型哈希到这个占位符舞蹈。
注意,例如在“useWeapon”哈希键中,一个接口也可以匿名实现
public class TestHarness
{
static public class PlaceHolderDance
implements InputDance
{
public void dance(String[] nline){
System.out.print("Action=" + nline[0] + "\n");
}
}
static public Hashtable<String, InputDance> inputActions;
// A static enclosure is to execute all the class definition once.
static {
inputActions = new Hashtable<String, InputDance>();
InputDance placeHolderAction = new PlaceHolderDance();
inputActions.put("create", new SoldierDance());
inputActions.put("move", placeHolderAction);
inputActions.put("search", placeHolderAction);
inputActions.put("heal", placeHolderAction);
// Can also anonymously implement an interface
inputActions.put("useWeapon",
new InputDance(){
public void dance(String[] nline){
System.out.print("weapon " + nline[0] + "\n");
}
}
);
}
// The static main method
public static void main(String[] args)
throws IOException, FileNotFoundException{
Scanner input = new Scanner(
new File("C:\\Users\\Ree\\Desktop\\SPR\\commands.txt"));
String line = input.nextLine();
String[] nline = line.split (",");
InputDance inputxn = inputActions.get(nline[0]);
if (inputxn!=null)
inputxn.dance(nline);
}
}
而且,如果士兵类与其输入舞之间存在一对一的对应关系,您甚至可以在士兵类中实施InputDance并提供舞蹈方法。