我对编程很新,并且刚刚设置了创建一个应用程序的任务,该应用程序将从用户输入读取.csv文件名,然后再运行一系列测试。最终,程序需要比较每一行(csv文件中的每一行代表一个路由器)并返回哪些路由器需要基于设置标准的补丁。 CSV文件的格式如下所示,标题为“主机名”,“IP地址”,“已修补?”,“黑客版本”和“注释”,不一定需要包括在内 -
A.example.COM, 1.1.1.1, NO, 11, Faulty fans
b.example.com, 1.1.1.2, no, 13, Behind other routers
C.EXAMPLE.COM, 1.1.1.3, no, 12.1
d.example.com, 1.1.1.4, yes, 14
c.example.com, 1.1.1.5, no, 12, Case a bit loose
e.example.com, 1.1.1.6, no, 12.3
f.example.com, 1.1.1.7, No, 12.2
g.example.com, 1.1.1.6, no, 15
因此,程序需要返回与任何其他路由器不共享相同主机名和IP地址的任何路由器的名称,当前操作系统版本为12或更高版本,或者尚未修补。
到目前为止,我已尝试将每个单独的行读作Java对象并从那里进行比较但是我没有成功。非常感谢任何有关如何使该计划有效的建议,谢谢。
答案 0 :(得分:1)
首先问问自己哪种数据结构最适合您的最终结果。
Id建议澄清他们的优先事项 - 因为一条线可以是" no"作为修补,超过9000,并有bazilion重复 - 你做什么呢? 但是让我们说你有独立的标准 - 即你检查,你招募两个hashMaps联合它们。一个用于重复,一个用于另外两个(更多机械标准)。 最终结果将是适合那些标准之一的东西。您可以构建逻辑以检查先前的哈希映射 - 如果它已在先前列表中设置 - 您可以跳过添加它们。但这将是使用更多CPU和更少内存的权衡。根据您输入的大小,您可以决定哪种方式更适合您。
现在检查重复项 - 您可以使用hashmap(非常快)检查重复项,并为该记录添加计数器。完成输入后 - 那些计数器== 1的那个将是你要找的那个。
顺便说一下 - 从文件或直接从测试代码设置自动加载。在开发过程中从控制台键入这些列表是一个令人厌倦和不受欢迎的过程。祝你好运。
答案 1 :(得分:1)
以下是我的建议:
答案 2 :(得分:1)
为您的csv格式工作解决方案。请参阅使用equals和hashCode查看包含方法的工作原理
您需要覆盖equals和hashcode方法以进行比较并使用contains()
方法
以下是您在此处发布的csv解决方案。
package csv;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Shailesh Singh
*/
public class CSV {
public static void main(String[] args) {
List<Router> routers = new ArrayList<Router>();
String fileToParse = "aaa.csv";
BufferedReader fileReader = null;
try
{
String line = "";
fileReader = new BufferedReader(new FileReader(fileToParse));
while ((line = fileReader.readLine()) != null)
{
String[] tokens = line.split("\\,", -1);
//First level filter based on your requirement.
if(Float.parseFloat(tokens[3])>=12 || tokens[2].toLowerCase().equals("no")){// this will check whether os version greater than 12 or pached no
routers.add(new Router(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4]));
}
}
}
catch (Exception e) {
e.printStackTrace();
}
finally
{
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
List<Router> uniqueList = new ArrayList<Router>();
System.out.println(routers);
System.out.println("\n..........................................");
for (Router router : routers) {
//Loop through all the objects and store in a new unique array list
//contains method works based on equals and hashcode
if (!uniqueList.contains(router)) {
uniqueList.add(router);
}
}
System.out.println(uniqueList);
}
}
现在 Router.java
package csv;
/**
*
* @author Shailesh Singh
*/
public class Router {
private String hostName;
private String ip;
private String patched;
private String osVersion;
private String note;
public Router(String hostName, String ip, String patched, String osVersion, String note) {
this.hostName = hostName;
this.ip = ip;
this.patched = patched;
this.osVersion = osVersion;
this.note = note;
}
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
//Getters and setters.....................
//Define all
@Override
public String toString() {
return "Router{" + "hostName=" + hostName + ", ip=" + ip + ", patched=" + patched + ", osVersion=" + osVersion + ", note=" + note + '}'+"\n";
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
Router r = (Router) obj;
if((hostName == r.hostName || (hostName != null && hostName.equals(r.getHostName()))) && (ip == r.ip || (ip != null && ip .equals(r.getIp())))){
return true;
}
else{
return false;
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((hostName == null) ? 0 : hostName.hashCode());
result = prime * result
+ ((ip == null) ? 0 : ip.hashCode());
return result;
}
}
请注意,equals()
方法和hashCode()
方法已在Router
类中重写。
解决方案的重要部分是
............................
List<Router> uniqueList = new ArrayList<Router>();
System.out.println(routers);
System.out.println("\n..........................................");
for (Router router : routers) {
//Loop through all the objects and store in a new unique array list
//contains method works based on equals and hashcode
if (!uniqueList.contains(router)) {//contains seeks equals and hashcode()
uniqueList.add(router);
}
}
System.out.println(uniqueList);