Java:Java面试问题的澄清

时间:2011-04-06 13:18:27

标签: java comparator

我最近参加了Java面试问题并得到了以下查询,其中我不知道答案

1>我有以下课程

 class CricketTeam{             
   String name; //this is the complete name(inclusive of first and last name)          
 }             

板球运动员姓名如下:

1> Sachin Tendulkar
2> Gautam Gambhir
3> Ricky Ponting
4> Shahid Afridi
5> Kevin Pieterson
6> MS Dhoni

我想通过他们的last name only对上述板球运动员名称进行排序。提供的Suugestions /代码将不胜感激。

2 - ;使用enhanced for loop的优点是什么? java.what中的iterator是在java中使用增强的for循环的优点,为什么在iterator可以完成工作时首先在java中引入它。?

3 个答案:

答案 0 :(得分:10)

  1. 实现一个Comparator,用于解析玩家姓名中的姓氏并对其进行比较,然后使用该比较器对板球运动员的集合进行排序。
    一个简单的例子(没有错误处理,假设所有玩家只有一个名字而没有中间名):

    class CricketTeamComparator implements Comparator<CricketTeam> {
        @Override
        public int compare(CricketTeam o1, CricketTeam o2) {
            String lastName1 = o1.name.split(" ")[1];
            String lastName2 = o2.name.split(" ")[1];
            return lastName1.compareTo(lastName2);
        }
    }
    
    ...
    
    List<CricketTeam> team = new ArrayList<CricketTeam>();
    ...
    Collections.sort(team, new CricketTeamComparator());
    
  2. 它更干净,更简洁,更安全(例如,避免多个嵌入循环中的特定细微错误,当迭代器因调用next()太多次而意外增加时)。 代码示例(来自Effective Java 2nd Edition,第46项:首选每个循环到传统for循环):

    // Can you spot the bug?
    enum Suit { CLUB, DIAMOND, HEART, SPADE }
    enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,
    NINE, TEN, JACK, QUEEN, KING }
    ...
    Collection<Suit> suits = Arrays.asList(Suit.values());
    Collection<Rank> ranks = Arrays.asList(Rank.values());
    List<Card> deck = new ArrayList<Card>();
    for (Iterator<Suit> i = suits.iterator(); i.hasNext(); )
      for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
        deck.add(new Card(i.next(), j.next()));
    

答案 1 :(得分:2)

1.查看此示例代码:

// assuming this is the list with cricket players
List<CricketTeam> team; 

Collections.sort(team, new Comparator<CricketTeam>) {
    int compare(CricketTeam o1, CricketTeam o2) {
        return o1.name.split(" ")[1].compareTo(o2.name.split(" ")[1])
    }
}

2.它更易读,更易于使用,并隐藏不必要的细节。

答案 2 :(得分:1)

对于问题1,您可以根据_(空格)分隔符拆分name字符串,然后根据name_arr[1]数组元素进行排序吗? “重组”数组元素以进行报告。

这是使用简单数组的代码示例。由于要求是根据姓氏进行排序,因此根据空格分隔符拆分字符串,翻转生成的名称,对数组进行排序,然后通过“重新翻转”进行改造(混乱,但是?:)

public static String[] FlipAndSort (String[] name) {

        for (int i=0;i<name.length;i++) {
            String [] flip = name[i].split(" ");
            name[i]=flip[1]+" "+flip[0];
        }
        Arrays.sort(name);
        for (int i=0;i<name.length;i++) {
            String [] flip = name[i].split(" ");
            name[i]=flip[1]+" "+flip[0];
        }
        return name;
    }

对于问题2,可读性是我个人的偏好......