簡體   English   中英

給定一組具有2個值的對象。 相對於第一個值,然后使用第二個值對集合進行排序

[英]Given a set of objects that have 2 values. Sort the set with respect to the 1st value and then with the 2nd value

例如。:

{2,3},{1,2},(2,2},{3,1},{2,1} to {1,2},{2,1},{2,2},{2,3},{3,1}

這就是我的想法:

對第一列值進行合並排序。 迭代集合以查看第一列中是否存在任何重復值。 如果有,請將它們列入列表。

合並在第二列上對此列表進行排序,然后將它們集成到主集中。 雖然看起來確實可行,但似乎過於復雜。 這應該在O(NlogN)運行,所以如果有人能想到更快/更復雜的算法也更簡單,請發布它!

謝謝!

只需實現一個Comparator<T> ,它通過首先比較第一個字段,然后在第一個字段相等的情況下移動到第二個字段來比較您的類型的任何兩個對象。 然后,您可以將該集復制到一個列表中,調用Collections.sort並將其列入列表和比較器。 沒有必要自己實現排序。

比較器將是這樣的:

public class TwoFieldComparator implements Comparator<Foo>
{
    public int compare(Foo first, Foo second)
    {
        // TODO: null checks
        int firstComparison = Integer.compare(first.x, second.x);
        return firstComparison != 0 ? firstComparison
                                    : Integer.compare(first.y, second.y);
    }
}

或者,您可以使您的類以相同的方式實現Comparable<T>

您需要做的是在第二列上執行穩定排序,然后在第一列上再次執行。

如果可以確定數字的范圍,則可以通過某種線性排序來實現O(N)。

編輯:

以'merge sort'為例(因為它穩定):
1,在第二列上運行合並排序,然后根據第二列的值排列數字對。
2,在第一列上再次運行合並排序,數字對將按第一列值的順序排列。 但是,因為排序方法是穩定的,這意味着如果第一個數字是相同的,第二個數字也將被排序(我們在第一個排序中進行了排序)。

因此,num對數組現在是有序的。 不再需要采取任何行動。
合並排序為O(NlogN),因此2 * O(NlogN)仍為O(NlogN)。

EDIT2:
好吧,我可能會讓這個問題變得復雜。 即使需要由我們自己實現排序方法,只要確定了數據結構,Jon Skeet在手工制作排序方法的相應部分填充比較代碼將是最方便的方法。

正如你在其中一篇文章中提到的,這是面試問題。 John Skeet的解決方案表明,您不必擔心項目中有兩個值 - 只需實現正確的比較器即可。

假設您在2011年被問到這一點,那么最好了解您的排序是如何使用的。 根據將使用此類型的環境,您可以考慮並行處理(使用多個線程)。 這可能會推動您選擇排序算法。

暫無
暫無

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

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