今天去一家公司面试,一开始就做上机题目,题目很简单,拿到我就有思路,但是到自己真正要去写的时候发现,下笔就错,很多细节问题以前都没考虑到,花了1个小时才把勉勉强强的做出来,大把错误,哎!,都怪自己平时动手太少,从今天开始多动手,立下一个flag;
今天把题目重新做了一下,题目如下:
读取read.txt文件
1.最小和最大的price 和对应的time
2.出现次数最多的price 和对应的time
3.按price去重后的size
read.txt的格式是name:xx,price:xx,time:xx,看起来像json字符串,这种形式的之前没写过直接上代码了
思路是把每一行的数据封装成一个对象;然后放入list中进行处理
实体类非常简单,略过了;
读取文件
1 public List<Item> read(File file) { 2 List<Item> list = new ArrayList(); 3 try { 4 System.out.println("开始读取"); 5 BufferedReader bd = new BufferedReader( new FileReader(file)); 6 while(bd.read()!= -1) {//使用read判断,会读取第一个字符,再调用readLine会从第二个字符出开始读, 7 8 String readLine = bd.readLine(); 9 //对String进行分割 10 Item item = new Item(); 11 String[] line = readLine.split(","); 12 for( String str:line) { 13 String[] split = str.split(":"); 14 if(split[0].equals("name")) { 15 item.setUsername(split[1]); 16 17 }else if(split[0].equals("price")) { 18 item.setPrice(Double.valueOf(split[1])); 19 }else { 20 item.setTime(split[1]); 21 } 22 23 } 24 list.add(item); 25 } 26 } catch (FileNotFoundException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 35 return list; 36 }
这里有一个小问题,我们在使用bd.read()!= -1的时候其实已经将文件第一个字符读取了,再调用readLine方法时会导致第一个字符没有,我找了好久也没有找到好的解决方法,只能就txt文件第一行空出来处理
1.最小和最大的price 和对应的time
//1.最小和最大的price 和对应的time public void first(List<Item> list) { double maxPrice=0.0; String maxTime=null; for(int j=0;j<list.size();j++) { if( list.get(j).getPrice()>maxPrice) { maxPrice = list.get(j).getPrice(); maxTime = list.get(j).getTime(); } } double minPrice=maxPrice; String minTime=null; ; for(int j=0;j<list.size();j++) { if( list.get(j).getPrice()<minPrice) { minPrice = list.get(j).getPrice(); minTime = list.get(j).getTime(); } } System.out.println("最"+maxPrice+" "+maxTime); System.out.println("最小"+minPrice+" "+minTime); }
题目很简单,但是如果写的不多,遇到for循环想半天,时间浪费很多;
2.出现次数最多的price 和对应的time
//出现次数最多的price public void second(List<Item> list) { int times = 0; for(int i=0;i<list.size();i++) { int k=0; double tem = list.get(i).getPrice(); for(int j=0;j<list.size();j++) { if( list.get(j).getPrice()== tem) { k++; } } System.out.println("k "+k+" tiems "+times); if(k>times) { times = k; } } System.out.println("出现最大次数" +times+" " ); }
这里在判断list.get(j).getPrice()== tem的时候注意 list.get(j).getPrice()是一个对象,我们的tem是一个数据类型,可以自动拆箱;不能定义为Double对象,不然比较的是内存地址
3.按price去重后的size
//去重使用hashSet public void third(List<Item> list) { Set set = new HashSet(); for(int i=0;i<list.size();i++) { set.add(list.get(i).getPrice().doubleValue()); } System.out.println("去重后次数" +set.size()); }
使用HashSet去重,因为是基本数据类型不用,重写hashCode和equals方法 在面试的时候我写成了linkedList这很尴尬,哈哈
找不到工作 ,不怪别人,还是自己的技术不到位,那些劝你面试吹水的人,其实只是站着说话不腰疼,面试不仅是hr面试你,也是你自己面试自己,你要是回答不上来,只能说自己努力不够,技术不到位。加油,继续找工作