開發一個簡單錯誤記錄功能小模塊,能夠記錄出錯的代碼所在的文件名稱和行號。
處理:
1.記錄最多8條錯誤記錄,對相同的錯誤記錄(即文件名稱和行號完全匹配)只記錄一條,錯誤計數增加;(文件所在的目錄不同,文件名和行號相同也要合併)
2.超過16個字符的文件名稱,只記錄文件的最後有效16個字符;(如果文件名不同,而只是文件名的後16個字符和行號相同,也不要合併)
3.輸入的文件可能帶路徑,記錄文件名稱不能帶路徑
輸入描述:
一行或多行字符串。每行包括帶路徑文件名稱,行號,以空格隔開。 文件路徑爲windows格式 如:E:\V1R2\product\fpgadrive.c 1325
輸出描述:
將所有的記錄統計並將結果輸出,格式:文件名代碼行數數目,一個空格隔開,如: fpgadrive.c 1325 1 結果根據數目從多到少排序,數目相同的情況下,按照輸入第一次出現順序排序。 如果超過8條記錄,則只輸出前8條記錄. 如果文件名的長度超過16個字符,則只輸出後16個字符
輸入例子:
E:\V1R2\product\fpgadrive.c 1325
輸出例子:
fpgadrive.c 1325 1
分析:
首先對要統計次數,然後對統計次數後的對象進行穩定排序,最後是輸出時記得檢查文件名的長度
代碼如下:
import java.util.*;
class MyObject implements Comparable<MyObject>{//自定義的類,並自定義比較規則
String nameNo; //文件名和錯誤行號的字符串
int count; //錯誤統計次數
@Override
public int compareTo(MyObject o) {
return o.count-this.count;
}
public MyObject(String nameNo, int count) {
super();
this.nameNo = nameNo;
this.count = count;
}
public String getNameNo() {
return nameNo;
}
public void setNameNo(String nameNo) {
this.nameNo = nameNo;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
ArrayList<MyObject> ob=new ArrayList<MyObject>();
while(sc.hasNextLine()){
String line=sc.nextLine();
String nameNo=line.trim().substring(line.trim().lastIndexOf("\\")+1);//文件名和行號
boolean flag=false;
for (int j = 0; j <ob.size(); j++) {
if(ob.get(j).getNameNo().equals(nameNo)){//存在
MyObject temp=ob.get(j);
temp.setCount(temp.getCount()+1);
ob.set(j, temp);
flag=true;
break;
}
}//end of for
if(flag==false){//不存在
MyObject o=new MyObject(nameNo, 1);
ob.add(o);
}
}//數據處理完畢
//sc.close();
Collections.sort(ob);//穩定排序
int coun=0;
while(coun<8&&coun<ob.size()){
String[] temp=ob.get(coun).getNameNo().split(" ");
String filename=temp[0].substring(temp[0].lastIndexOf("\\")+1);
if(filename.length()>16) filename=filename.substring(filename.length()-16);
System.out.println(filename+" "+temp[1]+" "+ob.get(coun).getCount());
coun++;
}
}
}