2016-11-28 83 views
0

一個數組包含數字字符串和混合字符串值。如何排序這個數組並首先打印數字值,然後打印剩餘的字符串?按值類型對數組排序

String[] s = {"1","2","13","13a","10","10a","1a","1,"}; 

我要像這樣的輸出 - >1 10 13 2 1, 10a 13a 1a

我試圖像這樣,我得到了正確的輸出,但我想使您更輕鬆的方式

import java.util.ArrayList; 
import java.util.Arrays; 

import java.util.regex.*; 

public class sortprog { 
    public static void main(String[] args) { 
    String[] s={"1","2","13","13a","10","10a","1a","1,"}; 
    ArrayList alnubers=new ArrayList(); 
    ArrayList alstrings=new ArrayList(); 
    int count=0; 
    for(int i=0;i<s.length;i++) 
    { 
    if(Pattern.matches("[0-9]+",s[i])) 
    { 
     alnubers.add(s[i]); 
    } 
    else 
    { 
     alstrings.add(s[i]); 
    } 
    } 
    /*for(int i=0;i<s.length;i++) 
    { 
     String str=s[i]; 
     for (int j = 0; j < str.length(); ++j) 
     { 
      char c = str.charAt(j); 
      int k = (int) c; 
      //System.out.println("ASCII OF "+c +" = " + k + "."); 
      if(k>=48&&k<=57) 
      { 
       count++; 
      } 
      else 
      { 
      count=0; 
      break; 
      } 
      } 
     if(count!=0) 
     { 
      alnubers.add(str); 
      count=0; 
     } 
     else 
     { 
      alstrings.add(str); 
      count=0; 
     } 
    }*/ 
    String[] sarr = new String[alstrings.size()]; 
    alstrings.toArray(sarr); 
    Arrays.sort(sarr); 
    String[] narr = new String[alnubers.size()]; 
    alnubers.toArray(narr); 
    Arrays.sort(narr); 
    String[] finalarr=new String[sarr.length+narr.length]; 
    for(int l=0;l<narr.length;l++) 
    { 
     finalarr[l]=narr[l]; 
    } 
    int i=0; 
    for(int l=narr.length;l<sarr.length+narr.length;l++) 
    { 
     finalarr[l]=sarr[i]; 
     i++; 
    } 

    for(int f=0;f<finalarr.length;f++) 
    { 
     System.out.println(finalarr[f]); 
    } 
    } 
} 
+1

你的意思是「排序」而不是「短路」? – Goodies

+0

檢查parseInt函數https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String) 您可以捕獲字符串的NumberFormatException並將它們分開出。然後分別對數字和字符串進行排序。 –

+0

@MaartenBodewes我認爲價值是根據OP提供的產出預期的。 –

回答

0

您可以撥打排序用你自己的比較器:

String[] s = { "1", "2", "13", "13a", "10", "10a", "1a", "1," }; 
Arrays.sort(s, new Comparator<String>() { 

    @Override 
    public int compare(String arg0, String arg1) { 
     if (arg0.matches("\\d+") 
       && !arg1.matches("\\d+")) { 
      return -1; 
     } else if (!arg0.matches("\\d+") 
       && arg1.matches("\\d+")) { 
      return 1; 
     } else { 
      return 0; 
     } 
    } 

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

這樣做是創建一個比較器, gs只包含數字(\\d),而不包含那些不包含的東西,因此它們在排序時會排在第一位。

你可以在比較器中放入任何你喜歡的代碼,所以如果你想要一個數字後跟一個逗號,那麼這很容易做到。

+0

列表 l = Arrays.asList(s);錯誤來了聽到 –

+0

是的,名單並不是真的有必要。我喜歡收藏。雖然從答案中刪除了該部分。請注意,如果比較器太複雜,您可以決定爲每個字符串計算一個值,然後比較這兩個值。 –