2013-03-25 60 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; 
} 

}