我完成了这个任务我应该解决:创建一个类,其构造函数以CSV格式解析文本(现在不必担心转义和引用)。构造函数的第二个参数是后续搜索所依据的字段的名称 完成。假设该字段中的值是唯一的。该类应实现CSVSearch接口:
interface CSVSearch {
CSVRecord find(String key); // returns null if nothing is found
}
interface CSVRecord {
String getField(String name);
}
然后我有一个示例用法:
CSVSearch csvByName = new YourCSVSearch(
"ip,name,desc\n"+
"10.0.0.1,server1,Main Server\n"+
"10.0.0.5,server2,Backup Server\n",
"name");
csvByName.find("server2").getField("ip") -> "10.0.0.5"
csvByName.find("server9") -> null
整个代码应占用20-30行。
首先,让我感到困惑的是,通过实现CSVSearch接口,它应该返回CSVRecord对象。但是CSVRecord是一个界面,所以我不能将它作为一个对象,对吧?
其次,如果我要实现接口,我应该如何链接他们的方法(csvByName.find("server2").getField("ip")
)?
我开始写我的解决方案:
public class CSVfinder {
public static void main(String[] args) {
CSVparser csvByName = new CSVparser("ip,name,desc\n"
+ "10.49.1.4,server1,Main Server\n"
+ "10.52.5.1,server2,Backup Server\n", "name");
}
}
class CSVparser implements CSVSearch, CSVRecord {
String lines[];
String keys[];
String values[];
public CSVparser(String text, String key_name) {
lines = text.split("\n");
keys = lines[0].split(",");
}
public String getField(String name) {
// TODO Auto-generated method stub
return null;
}
public CSVRecord find(String key) {
// TODO Auto-generated method stub
return null;
}
}
interface CSVSearch {
CSVRecord find(String key); // returns null if nothing is found
}
interface CSVRecord {
String getField(String name);
}
我迷失在这里......你怎么解决它?
答案 0 :(得分:2)
首先考虑接口:
当一个对象是一个实现接口的类时,它可以存储在接口类型的变量中。
例如,SomeInterface variable1 = new SomeInterfaceImplementation();
完全有效。
但是,您必须记住,如果未在接口定义中声明(或继承)它们,则无法在变量中调用实现中定义的任何方法(甚至是公共方法)。
也就是说,除了接口定义之外,问题解决方案的一般结构如下:
public class MyCSVSearch implements CSVSearch {
// Some constructor that would accept the file/text to parse and parse it with a good logic
public CSVRecord find(String key) {
MyCSVRecord record = new MyCSVRecord(); // Note this is your class that implements CSVRecord.
// The logic to store the record details into the record object
return record; // As said initially, it is ok to return an object of MyCSVRecord as it implements CSVRecord.
}
}
public class MyCSVRecord implements CSVRecord {
// May be you need some properties to store the data (perhaps a hash map).
public String getField(String name) {
// Return the relevant field from the properties
}
}
至于链接 - 你是对的。只需拨打csvByName.find("server2").getField("ip")
即可。
答案 1 :(得分:1)
看看样本,它说是YourCSVSearch。这就是Interfaces的重点,你班上的每个学生(你说这是一个作业)会想出自己解析CSV格式文件的方法,但是每个人都必须实现这两个接口,所以他们必须定义(覆盖) )2个函数:getField()和find()。
关键是当开发人员向另一个开发者提供任务时,他希望他给出一个他(第一个开发者)可以在他自己的程序中使用的结果...来简化它:你的老师可以写一个整个程序使用2个函数getField()和find()而不知道它们是如何工作的,只是因为他不需要,他希望你能使它们正确,然后期望结果他“被迫”。
现在回答“这怎么可能”......你需要了解抽象类和接口。虽然Interface可能看起来不是对象,但是当一个Class实现它时,接口内应该有一个抽象方法的定义,该类的实例是“那个接口”类型的对象,例如:
假设我正在开发一个与其他开发人员一起使用的几何应用程序,所以这里的一般想法是具有表面和周长的几何形式,但我希望其他开发人员来处理这些,所以,我做界面表格:
public interface Form {
public double perimeter();
public double surface();
}
所以第一个开发者决定制作Circle,所以他会这样做:
public class Circle implements Form {
//as soon as u implement form any IDE would tell u to implement the abstract methods
double r;
public Circle(double r){
this.r=r;
}
@Override //not necessary but this shows that you are defining the method now
public double surface(){
return Math.PI*r*r;
}
public double perimeter(){
return 2*math.PI*r;
}
现在第一个开发人员可以像这样创建Form类型的实例:
Form circle = new Circle(10);
System.out.println("the circle's surface is :"+circle.surface());
Form是接口,因此可以称为“type”,Circle是实现Form的Object然后它实际上是一个Form,所以Circle的任何实例也是一个Form,就像JAVA中的任何东西实际上都是一个Object
要将此应用于您的作业,您必须创建实现这些接口的类并以您自己的方式定义方法。至于你提到的链接
csvByName.find("server2").getField("ip")
csvByName是一个CSVSearch,然后方法find返回一个CSVRecord,而CSVRecord又定义了getField方法......这样才能正确使用。
现在关于界面,您可以阅读更多相关信息:here
关于如何制作解析器(查找记录和IP),你必须自己做,就像任何解析器一样,阅读文本或数据,找到关键字/字母......并检索数据,比如例如:
name: ali age: 21
name: X age: 30
正如您在“name:”之后看到的那样,您具有“age:”的值和相同的值,您可以阅读该文件并搜索这些关键字。 您可以阅读有关解析CSV here
的信息花点时间学习继承,因为它会在很久之后派上用场(这就是为什么我做了这么长的帖子:P),每次你使用Else的API时,你几乎要处理这个问题,祝你好运。