2017-03-06 108 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); 
相關問題