2017-03-06 105 views
0

我对编程相当陌生,刚刚设置了创建应用程序的任务,该应用程序将在用户输入之前从用户输入中读取.csv文件名一系列的测试。最终,程序需要比较每一行(csv文件中的每一行代表一个路由器),并根据设置标准返回哪些路由器需要修补程序。 CSV文件的格式看起来像这样与标题“主机名”,“IP地址”,“打补丁?”,操作系统版本,并说明其并不一定需要包括 -读取csv文件并比较每行数据的Java应用程序

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

你介意改写/解释,因为这似乎并不很好地定义你的条件/标准是什么? – hhafeez

回答

1

这里是我的建议:

  1. 创建一个类(姑且称之为 “路由器”),其中包含 “主机名” - 字符串, “ipAddresss” - 字符串, “打补丁” - 布尔, “OSVERSION” - 双和“笔记” - 字符串。添加相关的设置者和获取者。
  2. 创建一个包含“路由器”类列表并将其初始化为空的“路由器”列表。
  3. 创建一个将Router对象作为参数的方法。首先比较“osVersion”。然后遍历“路由器”列表。在迭代期间,将给定的Router对象与您遇到的每个Router对象进行比较。如果有重复,则不要执行任何操作,否则在迭代后将此对象添加到列表中。
  4. 遍历CSV文件的每一行,并将每一行解析为“路由器”对象,并调用从#3创建的方法。
  5. “路由器”应包含程序完成后的最终结果。
1

首先问自己哪种数据结构最适合您的最终结果。

  1. 你需要一个不允许重复的结构 - id说一个散列图 会很好。
  2. 你有3个指标分析争取线路在输出
    • 未打补丁 - 最简单的他们的所有指标分析
    • 版本超过12仍然没有认真思考它
    • 没有重复

身份证建议得到澄清他们的优先事项 - 因为一条线可能是“不”,修补程序超过9000,并有bazilion重复 - 你做了什么n? 但让我们说你有独立的标准 - 即你检查,你争取两个hashMaps结合他们。一个用于复制品,另一个用于其他两个(更多机械标准)。 最终的结果将是适合那些标准之一的事物。你可以建立逻辑来检查以前的hashmaps - 如果它已经在之前的列表中设置 - 你可以跳过添加它们。但是,这将是使用更多CPU和更少内存的折衷。根据您输入的大小,您可以决定什么对您更好。

现在检查重复项 - 你可以用hashmap(非常快)检查重复项,并为该记录添加一个计数器。当你完成你的输入 - 那些与计数器== 1将是你正在寻找的。

顺便说一句 - 建立自动加载,从文件或直接从测试代码。从控制台输入这些列表是开发过程中一个令人厌烦的过程。祝你好运。

1

工作解决方案为你的csv格式。查看contains方法如何使用equals和hashCode工作。
您需要覆盖equals和hashcode方法来比较和使用方法

以下是您在此处发布的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); 
相关问题