不學無數——在工作中被逼出來的解決之道
在工作中被逼出來的解決之道
相信初入職場的小夥伴們肯定經歷過在組內統計一些東西的事情,簡單卻繁瑣。前一段時間給了一個關於統計組內各個系統中都用了哪些使用者下的表的任務。剛拿到這個任務的時候,就是按照之前的思維模式進行完成的,直接在編輯工具中全域性搜尋查詢使用者名稱.
(因為我們公司的表都是使用者名稱.表名
),在第一個系統中的時候我這麼幹還行,因為涉及到的使用者也少,表也少。所以也就很快的按部就班的完成了,但是隨著後面系統的越來越多,涉及到的使用者以及表越多,如果我還是這麼幹下去,無聊不說而且容易出錯。最主要原因還是懶,太浪費時間了,所以想想有沒有更加簡單便捷的辦法能夠幫我完成這些事。找人幫忙是不可能的,思來想去熟悉的只有寫程式碼了。所以分析了下這件事的可行性。
Mybatis 使用者名稱.T_使用者名稱_表名
所以基本上思路就清晰了
Map<String,List<String>>
第一步是先寫了讀取資料夾下所有檔案的程式碼:
public static String getFileName(String path) throws IOException { File file = new File(path); File[] tempList = file.listFiles(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < tempList.length; i++) { if (tempList[i].isDirectory()){ //如果是資料夾就進行遞迴呼叫 String str2 =getFileName(tempList[i].getPath()); stringBuilder.append(str2); } else { String str = readFile(path+"/"+tempList[i].getName()); stringBuilder.append(str); } } return stringBuilder.toString(); }
在剛寫這段程式碼的時候,卡到了對於資料夾的下面還存在資料夾的問題上,因為有可能A資料夾存在B資料夾,B資料夾下存在C檔案等等。然後突然想到了這和之前學過的ofollow,noindex">組合模式 非常的相似,都是描述部分和整體關係。意思就是使得使用者對單個物件和組合物件的使用具有一致性。
第二步這裡就寫了關於正則表示式提數
public static String readFile(String fileName) throws IOException { BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName)); String str; StringBuilder stringBuilder = new StringBuilder(); while ((str = bufferedReader.readLine()) != null){ stringBuilder.append(str.toUpperCase() +"\n"); } bufferedReader.close(); String str2 = stringBuilder.toString().toUpperCase().replaceAll("\t",""); String pattern = "T_[A-Z][A-Z][A-Z]_[A-Z_]+"; Pattern r = Pattern.compile(pattern); Matcher matcher = r.matcher(str2); StringBuilder resultString = new StringBuilder(); while (matcher.find()){ String result= matcher.group(0); resultString.append(result+"\n"); } return resultString.toString(); }
第三步就是對於所有提出來的數進行去重和歸類
public static void printDate(String string){ String [] ArrStr= string.split("\n"); Set<String> set =new HashSet(); Map<String,List<String>> map = new HashMap<>(); for (int i = 0; i < ArrStr.length; i++) { set.add(ArrStr[i]); } for (String s:set){ if (!s.isEmpty()){ String qianzhui=s.substring(s.indexOf("_")+1,s.indexOf("_")+4); String tableName= qianzhui+"."+s; if (!map.containsKey(qianzhui)){ List<String> list = new ArrayList<>(); list.add(tableName); map.put(qianzhui,list); }else { List<String> resultList = map.get(qianzhui); resultList.add(tableName); map.put(qianzhui,resultList); } } } for (String str:map.keySet()){ System.out.println(str); List myList = map.get(str); myList.forEach((resultStr)->{ System.out.println(resultStr); }); System.out.println("-------------"); } }
雖然寫程式碼花費了一些時間,但是花費2小時寫程式碼,統計所有的系統有可能得1天的時間,其中還是人力統計還會有可能出錯。所以花費這點時間寫程式碼還是很有用的。最主要是鍛鍊瞭解決問題的思維,以後碰到問題之後要想最優解是什麼而不是拿到一個問題就直接上來悶頭幹,有可能最後還吃力不討好。