簡體   English   中英

如何按數字順序對字符串數組進行排序?

[英]how to sort array of strings in numerical order?

我有一個字符串 [] 的價格,可能如下所示:

String[0] = 1.22
String[1] = 230.08
String[2] = 34.11

我需要轉換數組並按升序對其進行排序。 做這個的最好方式是什么? 數組可能非常大,因此性能很重要。 先感謝您。

您可以定義一個專門的字符串比較器:

class MyComparator implements Comparator<String> {
    public int compare(Object a, Object b) {
        return Float.valueOf(a.toString()).compareTo(Float.valueOf(b.toString());
    }
}

然后使用以下命令對您的字符串數組進行排序:

Arrays.sort(aStringArray, new MyComparator());

(注意可能有更有效的方法來比較表示浮點值的兩個字符串。)

排序 arrays 是一個經典問題。 這里的問題是當您對數組進行排序和添加時。

您需要對每個添加進行排序嗎? 你會在排序后添加嗎?...等。

如果您要在排序后逐一添加,我建議使用ArrayList而不是數組。 這樣,您可以通過跟蹤ArrayList找到插入點,並在更快的時間內將其放入該索引中。

另外,對於排序,你應該看這里: http://en.wikipedia.org/wiki/Sorting_algorithm ,快速排序是最著名的。

像這樣的簡單解決方案應該適合您:

    String[] vars = {"1.22","230.08","34.11"};

    List<Float> newlist = new ArrayList<Float>();
    for (String s : vars) {
        newlist.add(Float.valueOf(s));  // converts your string to float
    }
    Collections.sort(newlist);

Collections.sort()將對您的列表進行適當的排序(返回 void,因此不要嘗試將其分配給那里的新變量)。 此時新列表包含newlist 使用下面評論中的新信息,您希望將它們改回字符串。 你可以用另一個循環來做到這一點:

    List<String> numsAsStrings = new ArrayList<String>();
    for (Float f : newlist) {
        numsAsStrings.add(f.toString());
    }

如果您想將List重新轉換為您開始使用的數組,您可以使用Collection接口中的toArray方法:

    vars = numsAsStrings.toArray(new String[0]);

我建議嘗試這種“默認”搜索,看看它是否足夠快滿足您的需求。 它對事物進行分類的速度通常令人驚訝。 只有在嘗試了內置並獲得了關於速度的想法之后,我才會尋求另一種算法。 否則就是過早的優化。

正如您從所有新增內容中看到的那樣,最初是一個簡單的解決方案變成了很多代碼(除了sort()方法在內部執行的任何操作之外,還循環了兩次)。 雖然即使對於初學者來說,這個解決方案也很容易遵循,但我不得不推薦使用 Ted Hopp 建議的Comparator方法,並選擇他的答案作為正確的答案。 對於必須查看您的代碼的下一個人來說,閱讀的代碼將更少(我唯一的建議是將比較器命名為“stringAsFloatComparator”)

比較器是有用的、強大的、優雅的東西。 如果您不熟悉它們,我建議您閱讀Java 教程的比較器部分。

如果您將在排序后添加到此數組,那么您可能需要考慮不同的數據結構,例如自平衡二叉樹(如紅黑樹)。

但是,如果這是一次性排序,則使用Arrays.sort並按照 Ted Hopp 的建議定義您自己的Comparator器。 但是,這是一種比較排序,因此如果O(nlg(n))會有一個下限。 如果這還不夠快,您可能想嘗試使用計數排序作為O(n)時間的后備穩定排序的基數排序- 這不會使代碼更復雜,因此可能容易出錯且不易維護。

這是對數組進行排序的有效方法:

// Creates a list from the prices array and the list is sorted
List<String> list = new ArrayList<String>(list);
Collections.sort(list);

現在不需要裝箱(即不需要創建OBJECT使用新的運算符使用 valueOf 與 Collections.Sort..的 compareTo 相結合)

首先使用以下代碼轉換您的字符串數組:

String[] floats={"0.1","0.2","0.3"};
for(int i=0;i<floats.length;i++) 
{
    List<Float> temp = Collections.singletonList(Float.parseFloat(floats[i]));
} 

1)升序

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(lhs.getDistance()).compareTo(rhs.getDistance());
      }
 });

1)對於降序

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(rhs.getDistance()).compareTo(lhs.getDistance());
      }
 });

稍后如果你想要你的 String arrays 然后使用下面的代碼:

Float xyz[] = temp.toArray( new Float[temp.size()]);
String floats[]=new String[temp.size()];

for (int i = 0; i < xyz.length; i++) {
     floats[i] = String.valueOf(xyz[i]);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM