2013-03-25 85 views
0

我想输入名字和姓氏。之后,将根据姓氏进行排序并显示姓氏和名字。 。 例如。排序第二个字

输入: -

John smith 
Albert kennedy 
John dsouza 

输出

John dsouza 
Albert kennedy 
John smith 
+0

你问一个问题的方法? – Neppinger 2013-03-25 15:01:38

+1

如果你使用3个不同的名字,你的陈述会更清晰。 – 2013-03-25 15:03:51

回答

1

您需要创建自己的Comparator并根据给定的ComparatorList进行排序。以下是演示:

import java.util.*; 
class SortLastName 
{ 
    public static void main(String[] args) 
    { 
     List<String> list= new ArrayList<String>(); 
     list.add("John smith"); 
     list.add("Albert kennedy"); 
     list.add("John dsouza"); 
     System.out.println("Before sorting :"+list); 
     Collections.sort(list,new myComparator()); 
     System.out.println("After sorting :"+list); 
    } 
    static class myComparator implements Comparator<String> 
    { 
     public int compare(String str1,String str2) 
     { 
      String[] tokens1 = str1.split("\\s+"); 
      String[] tokens2 = str2.split("\\s+"); 
      int i = tokens1[1].compareTo(tokens2[1]); 
      return i; 
     } 
    } 
} 
0
+0

尝试解释提问者此链接将传达给他的内容,而不是将其放在此处。 – Parth 2013-03-25 15:12:04

+0

这个问题不是非常详细,也没有尝试过与之对抗,我的回应是在没有粘贴所需的代码的情况下朝正确的方向推动。 – SpaceCowboy 2013-03-25 16:46:58

0

您可以使用自定义字符串比较来实现这一目标:

public class LastNameComparator implements Comparator<String>{ 

    public int compare(String object1, String object2) { 

     String name1 = object1.split("\\s+")[1].toUpperCase(); 
     String name2 = object1.split("\\s+")[1].toUpperCase(); 

     return name1.compareTo(name2); 

    } 

} 

然后用Colllections排序methold

Collections.sort(namesList, new LastNameComparator()); 

注意你需要确保您的输入匹配:“FirstName LastName”格式以避免任何ArrayOutofBoundException如果名称没有空格或者名称包含多个部分时出现意外结果。

0
String[] names = { "John smith", "Albert kennedy", "John dsouza" }; 
Arrays.sort(names, new Comparator<String>() { 

    @Override 
    public int compare(String firstName, String lastName) { 
     return firstName.split("\\s+")[1].compareTo(lastName.split("\\s+")[1]); 
    } 

}); 
System.out.println(Arrays.toString(names)); 

,或者创建会替你如下

private static Object[] sortLastName(Object[] a) { 
    Object[] temp = new Object[a.length]; 

    for (int i = 0; i < temp.length - 1; i++) { 
     if (a[i].toString().split("\\s+")[1].compareTo(a[i + 1].toString()     .split("\\s+")[1]) < 0) { 
      temp[i] = a[i]; 
      temp[i + 1] = a[i + 1]; 
     } 
    } 

    return temp; 
} 
0
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 

/** 
* 
* @author pramod 
*/ 
public class SortNames { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    // TODO code application logic here 
    String name1 = "John Smith"; 
    String name2 = "Albert kennedy"; 
    String name3 = "John dsouza"; 
    String name4 = "John Dsouza"; 
    String name5 = "Mark Smith"; 
    String name6 = "john Kennedy"; 

    ArrayList<String> inputStringList = new ArrayList<String>(); 
    inputStringList.add(name1); 
    inputStringList.add(name2); 
    inputStringList.add(name3); 
    inputStringList.add(name4); 
    inputStringList.add(name5); 
    inputStringList.add(name6); 
    System.out.println(inputStringList); 
    System.out.println("\n\n\n"); 
    ArrayList<Name> nameList = sortByLastNames(inputStringList); 
    System.out.println(nameList); 


} 

public static class Name implements Comparator<Name> { 

    String fname; 
    String lname; 

    public Name() { 
    } 

    public Name(String fname, String lname) { 
     this.fname = fname; 
     this.lname = lname; 
    } 

    @Override 
    public String toString() { 
     return fname + " " + lname; 
    } 
    /* 
    * Writing custom comparator to compare both the names. Code will 
    * compare based on last name and then first name (ignores cases). 
    */ 

    @Override 
    public int compare(Name o1, Name o2) { 
     return o1.lname.compareToIgnoreCase(o2.lname) != 0 
       ? o1.lname.compareToIgnoreCase(o2.lname) 
       : o1.fname.compareToIgnoreCase(o2.fname); 
    } 
} 

/** 
* Code will split based on the first space. 
* Uses trim to remove the leading and ending spaces. Then, 
* Considers the string before first space as fname and string after first space as lname. 
* @param inputStringList - ArrayList<String> - input list of Strings that 
* needs to be sorted as names 
* @return - ArrayList<Name> - output List of Names that are sorted. 
*/ 
public static ArrayList<Name> sortByLastNames(ArrayList<String> inputStringList) { 
    if (inputStringList == null) { 
     return null; 
    } 
    ArrayList<Name> nameList = new ArrayList<Name>(); 
    for (String fullName : inputStringList) { 
     if (fullName != null && fullName.trim().equalsIgnoreCase("")) { 
      int firstSpace = fullName.trim().indexOf(' '); 
      String fname = ""; 
      String lname = ""; 
      if (firstSpace != -1) { 
       fname = fullName.substring(0, firstSpace).trim(); 
       lname = fullName.substring(firstSpace, fullName.length()).trim(); 
      } else { 
       fname = fullName; 
       lname = ""; 
      } 
      Name name = new Name(fname, lname); 
      nameList.add(name); 
     } 
    } 
    Collections.sort(nameList, new Name()); 
    return nameList; 
} 

}