java算法与编程面试题(五)

2019-03-05 13:13|来源: 网友

从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:

1,张三,28

2,李四,35

3,张三,28

4,王五,35

5,张三,28

6,李四,35

7,赵六,28

8,田七,35

程序代码如下(答题要博得用人单位的喜欢,包名用该公司,面试前就提前查好该公司的网址,如果查不到,现场问也是可以的。还要加上实现思路的注释):

package com.huawei.interview;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeSet;
public class GetNameTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
          //InputStream ips = GetNameTest.class
          //  .getResourceAsStream("/com/huawei/interview/info.txt");
          //用上一行注释的代码和下一行的代码都可以,因为info.txt与
          //GetNameTest类在同一包下面,所以,可以用下面的相对路径形式
         
        Map results = new HashMap();
          InputStream ips = GetNameTest.class
                           .getResourceAsStream("info.txt");
          BufferedReader in = new BufferedReader(
                            new InputStreamReader(ips));
        String line = null;
        try {
            while((line=in.readLine())!=null)   {
                dealLine(line,results);
            }
            sortResults(results);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
          static class User{
        public  String name;
        public Integer value;
        public User(String name,Integer value){
            this.name = name;
            this.value = value;
        }
        @Override
        public boolean equals(Object obj) {
            //下面的代码没有执行,说明往treeset中增加数据时,            //不会使用到equals方法。
            boolean result = super.equals(obj);
            System.out.println(result);
            return result;
        }
    }
    private static void sortResults(Map results) {
        TreeSet sortedResults = new TreeSet(
                new Comparator(){
                    public int compare(Object o1, Object o2) {
                        User user1 = (User)o1;
                        User user2 = (User)o2;
                          /*如果compareTo返回结果0,则认为两个对象相等,                           *新的对象不会增加到集合中去。所以,
                           *不能直接用下面的代码,否则,那些个数相同                           *的其他姓名就打印不出来。
                         */
                         
                        //return user1.value-user2.value;
                        //return user1.value<user2.value?-1:user1.value==user2.value?0:1;
                        if(user1.value<user2.value){
                            return -1;
                        }else if(user1.value>user2.value)    {
                            return 1;
                        }else{
                            return user1.name.compareTo(user2.name);
                        }
                    }
                }
        );
        Iterator iterator = results.keySet().iterator();
        while(iterator.hasNext()){
            String name = (String)iterator.next();
            Integer value = (Integer)results.get(name);
            if(value > 1){               
                sortedResults.add(new User(name,value));            
            }
        }
        printResults(sortedResults);
    }
    private static void printResults(TreeSet sortedResults){
        Iterator iterator  = sortedResults.iterator();
        while(iterator.hasNext()){
            User user = (User)iterator.next();
            System.out.println(user.name + ":" + user.value);
        }   
    }
    public static void dealLine(String line,Map map){
        if(!"".equals(line.trim())){
            String [] results = line.split(",");
            if(results.length == 3) {
                String name = results[1];
                Integer value = (Integer)map.get(name);
                if(value == null) value = 0;
                map.put(name,value + 1);
            }
        }
    }
}


本文链接:领悟书生教程网-面试题大全,转载请注明出处

相关问答

更多
  • java基础面试题[2022-04-05]

      1.抽象:   抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。   2.继承:   继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继 承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变 ...
  • 哎 我应聘了N家公司 给你一些题好了 华为的 第一部分:选择题   QUESTION NO: 1   1、public class Test {   public static void changeStr(String str){   str="welcome";   }   public static void main(String[] args) {   String str="1234";   changeStr(str);   System.out.println(str);   }   }   ...
  • Java面试题[2022-05-31]

    1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打 算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数 据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新 类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类 ),而原始类称为新类的基类(父类)。派生类可以从它的基类 ...
  • java基础面试题[2023-10-31]

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继 承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修 ...
  • ?不把问题贴出来,肚子里的萨姆大叔才回答你的问题呢。。。
  • java基础,面向对象,线程,流,jdbc,集合,网络编程,异常,常用的数据结构。 javascript:(函数,对象,操作页面元素。) jsp:(内置对象,标准动作,javabean servlet 自定义标签) struts2:(mvc设计模式,分层软件设计模式) 要考的基本上就这些,还有好多都是逻辑题。我是java的爱好者 我QQ是88986735 有时间一起讨论讨论呀?
  • 基于AXIS的web service: 1 比如要建一个Server.java类的web service public class Server { public String printInfo(String name){ return "Hello,"+name; } } 2 把Server.java改为Server.Jws放到 …\Tomcat 5.5\webapps\axis中,重启服务器 3 访问 4 在cmd中输入 cd D:\Program Files\Apache Software Foun ...
  • 我有一部分!
  • 觉得范围太大,没有特别经典的题。如果看知识广度,需要了解1)servlet规范及常见servlet-based的server,如tomcat, jetty..2)主流框架的使用及原理,如表示层的struts/struts2,管理服务对象生命周期的spring,持久层的hibernate/jpa..然后看情况选其一深入研究实践即是。