开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
文件路径为windows格式
如:E:V1R2productfpgadrive.c 1325
输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1
结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
如果超过8条记录,则只输出前8条记录.
如果文件名的长度超过16个字符,则只输出后16个字符
输入例子:
E:V1R2productfpgadrive.c 1325
输出例子:
fpgadrive.c 1325 1
先贴我的代码,不过无法AC,显示“运行错误:请检查是否存在数组越界非法访问,野指针乱访问,空指针乱访问等情况”,eclipse可以运行,具体还没找到原因,可能代码较为混乱吧
1 package com.zbt.temp; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.LinkedHashMap; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Scanner; 9 import java.util.Set; 10 11 public class CopyOfhuawei2016 { 12 13 public static void main(String[] args) { 14 Map<String, String> m = new LinkedHashMap<String, String>(); 15 Scanner sc = new Scanner(System.in); 16 while (sc.hasNextLine()) { 17 String s = sc.nextLine(); 18 String fn = fullNameLine(s); 19 String pn = partNameLine(s); 20 Set<String> se = m.keySet(); 21 Iterator<String> it = se.iterator(); 22 23 if (!se.isEmpty()) { 24 int flag = 0; 25 while (it.hasNext()) { 26 String tem1 = it.next(); 27 String tem2 = fullNameLine(tem1); 28 29 if (fn.equals(tem2)) {// 如果文件全名和行号都相等 30 String[] tem3 = m.get(s).split(" "); 31 int i = Integer.valueOf(tem3[tem3.length - 1]);// 找到记录次数 32 m.put(s, pn + " " + (++i)); 33 } else 34 flag++; 35 if (flag == se.size()) { 36 m.put(s, pn + " " + 1); 37 } 38 } 39 40 } else { 41 m.put(s, pn + " " + 1); 42 } 43 } 44 sc.close(); 45 List<String> li = new ArrayList<String>(); 46 Set set = m.keySet(); 47 Iterator<String> it = set.iterator(); 48 while (it.hasNext()) { 49 li.add(m.get(it.next())); 50 } 51 for (int i = 0; i < li.size(); i++) { 52 for (int j = li.size() - 2; j >= i; j--) { 53 int n1 = convert(li.get(j)); 54 int n2 = convert(li.get(j + 1)); 55 if (n1 < n2) { 56 String temp = li.get(j); 57 li.set(j, li.get(j + 1));// li.get(j)=li.get(j+1);这是错误的写法,对象无法复制给对象,下同 58 li.set(j + 1, temp);// li.get(j+1)=temp; 59 } 60 } 61 62 } 63 64 if (li.size() > 8) { 65 for (int i = 0; i < 8; i++) { 66 System.out.println(li.get(i)); 67 } 68 } else { 69 for (int i = 0; i < li.size(); i++) { 70 System.out.println(li.get(i)); 71 } 72 } 73 } 74 75 public static String fullNameLine(String s) { 76 String[] str = s.split("\\"); 77 String str1 = str[str.length - 1];// 获得文件名与行数 78 return str1; 79 } 80 81 public static String partNameLine(String s) { 82 String[] str = s.split("\\"); 83 String[] str1 = str[str.length - 1].split(" ");// 把行数与文件名分开 84 String s1 = null; 85 if (str1[0].length() > 16) {// 如果文件名大于16字符 86 s1 = str1[0].substring(str1[0].length() - 16, str1[0].length());// 求出文件名大于16字符的截断文件名 87 } else { 88 s1 = str1[0]; 89 } 90 return (s1 + " " + str1[1]); 91 } 92 93 public static int convert(String s) {//获得出现次数 94 String ls = String.valueOf(s.charAt(s.length() - 1)); 95 int jj = Integer.valueOf(ls); 96 return jj; 97 } 98 99 }
看到一个网友代码,思路比较清晰,想法比较一致,可以AC,贴上来
1 package test.huawei.com; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.LinkedHashMap; 7 import java.util.List; 8 import java.util.Map; 9 import java.util.Map.Entry; 10 import java.util.Scanner; 11 12 /** 13 * @author jelly 14 * 15 */ 16 public class FileErrorLog { 17 18 /** 19 * @param args 20 */ 21 public static void main(String[] args) { 22 Map<String, Integer> result = new LinkedHashMap<>(); 23 Scanner scanner = new Scanner(System.in); 24 while (scanner.hasNext()) { 25 String log = scanner.nextLine(); 26 String file = log.substring(log.lastIndexOf("\") + 1); 27 if (result.containsKey(file)) { 28 result.put(file, result.get(file).intValue() + 1); 29 } else { 30 result.put(file, 1); 31 } 32 } 33 scanner.close(); 34 35 List<Map.Entry<String, Integer>> resultList = new ArrayList<>(result.entrySet()); 36 // 排序 37 Collections.sort(resultList, new Comparator<Map.Entry<String, Integer>>() { 38 39 @Override 40 //按照value从大到小排序 41 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 42 if (o1.getValue() > o2.getValue()) { 43 return -1; 44 }else if (o1.getValue() < o2.getValue()) { 45 return 1; 46 } 47 return 0; 48 } 49 }); 50 51 List<String> ret = new ArrayList<>(); 52 int count = 0; 53 for(Entry<String, Integer> log: resultList){ 54 if (count < 8) { 55 String fileName = log.getKey().split(" ")[0]; 56 if (fileName.length() > 16) { 57 ret.add(fileName.substring(fileName.length() - 16) + " " + log.getKey().split(" ")[1] + " " 58 + log.getValue()); 59 } else { 60 ret.add(log.getKey() + " " + log.getValue()); 61 } 62 } 63 count++; 64 65 } 66 for(String s: ret){ 67 System.out.println(s); 68 } 69 } 70 71 }