2016-02-15 53 views
2

我寫了一個程序,要求用戶輸入名稱到數組中,然後名稱按字母順序排序......該程序運行良好,但我想知道是否可以對由第二,第三,或每個字符串中的第4個字符?例如,如果用戶輸入了Bob,Dan和Kris,程序應該將它們排序爲Dan,Bob,Kris。這是我的計劃,由字符串的第一個字母排序我的字符串數組:如何通過每個字符串的第二個字符串來排序字符串數組?

import java.util.ArrayList; 
    import java.util.Arrays; 
    import java.util.List; 
    import java.util.Scanner; 


public class SortingAnArrayOfStrings { 




public static void main(String[] args) { 


{ 
    //Ask the user for names to add to the array 
    List<String> list=new ArrayList<String>(); 
    Scanner in=new Scanner(System.in); 
    do { 
     System.out.println(" The names on the list are "+list); 
     System.out.println("Would you like to add another name to the list? (y/n)"); 

     if (in.next().startsWith("y")) { 
      System.out.println("Enter:"); 
      list.add(in.next()); 
     }else{break; 

     } 
    } while (true); 
    //display the names that have been added to the array 
    System.out.println("The names on the list are "+list); 

    //sort the array of names in alphabetical order 
    String[] Arr=list.toArray(new String[list.size()]); 
    String[] stringArray=new String[Arr.length]; 

    for(int i=0;i<Arr.length;i++) 
    { 
     for (int j = i+1; j < Arr.length; j++) { 
      if (Arr[i].trim().compareTo(Arr[j].trim())>0) { 
       String temp=Arr[j]; 
       Arr[j]=Arr[i]; 
       Arr[i]=temp; 
      } 
     } 
     stringArray[i]=Arr[i]; 
    } 

    //display the sorted list of names 
    System.out.println("This is the list of names after sorting them in alphabetical order : "); 

    for(String ss:stringArray){ 
     System.out.print(ss + " "); 

    } 
    } 

} 
} 

回答

3

你可以使用自定義了java.util.Comparator嘗試類似波紋管:

String[] names = {"Dan", "Bob", "Kris"}; 
java.util.Collections.sort(java.util.Arrays.asList(names), new java.util.Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     // TODO: Argument validation (nullity, length) 
     return s1.charAt(1) - s2.charAt(1);//comparision 
    } 
}); 

for (String name : names) System.out.println(name); 

輸出:

Dan 
Bob 
Kris 
+0

謝謝。這非常有幫助,但可以在不使用比較器的情況下編寫程序嗎? – pikProgram

+0

@pikProgram - 你可以用''for''循環進行手動解析,但有機會犯錯,代碼看起來很冗長,很難閱讀。所以我們應該使用java功能來利用語言。 – mmuzahid

+0

我明白了......謝謝...... – pikProgram

2

你可以試試這個,只需使用Lambda表達式添加自定義比較,如果你使用的是Java版本1.8或以上:

list.add("Bob"); 
list.add("Dan"); 
list.add("Kris"); 
Collections.sort(list, (s1, s2) -> { 
    String sb1 = s1.substring(1); 
    String sb2 = s2.substring(1); 
    return sb1.compareTo(sb2); 
    }); 

System.out.println("list = " + list); 

結果:

list = [Dan, Bob, Kris] 
-2

你想用一個custom comparator

+0

發送一個簡單的鏈接不是一個好的答案,即使它是正確的 –

-1

添加基於需求的java.util.Comparator的不同實現,並使用

public static <T> void sort(List<T> list, Comparator<? super T> c)在集合類對列表進行排序。

0

我還沒有測試過這個,但你可以試試這個。用這個替換你的代碼的條件部分。 雖然,可能會有一些性能問題。

if (Arr[i].trim().compareTo(Arr[j].trim())>0) { 

替換:

if (Arr[i].trim().charAt(nthChar) > Arr[j].trim().charAt(nthChar)) { 

的nthChar是字符位置來比較。

0

這裏是樣品測試的代碼。你需要使用比較器來實現順序。 這裏訂單的價值可以根據您的要求進行任何操作。你可以用這個代替你當前的代碼,因爲它對於正常的排序也很好(基於索引0)。它可能需要根據您的需要進行一些調整。

String str[] = {"abc","bca","avc","ert"}; 
    final int ORDER = 1; 
    Arrays.sort(str, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      return o1.toLowerCase().charAt(ORDER) - o2.toLowerCase().charAt(ORDER) ; 
     } 
    }); 
相關問題