我有一個集合(名單<矩形>),我需要梳理左右。這部分很簡單。然後我想遍歷原始順序中的矩形,但很容易在排序後的集合中找到它們的索引。 indexOf()將不起作用,因爲我可能有許多相同的對象。我不禁感到應該有一個簡單的方法來做到這一點。如何排序索引映射回收集原始索引我整理
1
A
回答
2
我已經找到了解決辦法 - 但也許有一個整潔的/更優化的一個在那裏。
List<Rectangle> originalRects = ...;
/* record index of each rectangle object.
* Using a hash map makes lookups efficient,
* and using an IdentityHashMap means we lookup by object identity
* not value.
*/
IdentityHashMap<Rectangle, Integer> originalIndices = new IdentityHashMap<Rectangle, Integer>();
for(int i=0; i<originalRects.size(); i++) {
originalIndices.put(originalRects.get(i), i);
}
/* copy rectangle list */
List<Rectangle> sortedRects = new ArrayList<Rectangle>();
sortedRects.addAll(originalRects);
/* and sort */
Collections.sort(sortedRects, new LeftToRightComparator());
/* Loop through original list */
for(int i=0; i<sortedRects.size(); i++) {
Rectangle rect = sortedRects.get(i);
/* Lookup original index efficiently */
int origIndex = originalIndices.get(rect);
/* I know the original, and sorted indices plus the rectangle itself */
...
2
如果沒有對象數以萬計的,你可以只將它們存儲在兩個單獨的集合,一個原始的,一個排序。請記住,在Java中集合類只能存儲引用對象,所以這不會佔用盡可能多的內存,因爲它看起來。
0
克隆的名單和他們的排序之一。由於指向同一個對象的指針是相同的,並且你不能在它們之間進行區分,所以使用indexOf()對同一個對象進行兩次引用並不重要。 如果你有兩個相同但不相同的對象,並且你想區分它們,那麼你確實有問題,因爲indexOf()正在使用equal方法。 在這種情況下,最好的解決方案可能是遍歷列表並檢查對象標識(==)。
0
另一種方法是對索引數組進行排序,而不是對原始列表進行排序。該數組以一個標識數組a [0] = 0,a [1] = 1等開始,然後使用自定義比較器/排序來獲取索引數組。不需要太多的額外空間,因爲您只有一個額外的整數數組而不是另一個集合。
相關問題
- 1. 映射排序索引
- 2. QTableWidget原始索引排序
- 3. 索引映射從排序到原始數組
- 4. 行索引映射回原來的索引數據幀
- 5. 。收集索引
- 6. C++索引到索引映射
- 7. Elasticsearch索引模板丟失原始字符串映射
- 8. 在Excel中如何在排序後得到原始行索引
- 9. matlab反向映射索引
- 10. 如何獲得索引別名映射
- 11. Padrino如何映射:索引到'/'?
- 12. 巢:如何做一個索引映射通過傳遞原始請求?
- 13. ng-grid原始行索引
- 14. mongodb索引查找索引排序
- 15. Matlab:按行升序排序但跟蹤原始索引
- 16. 按集羣式列存儲索引中的索引排序
- 17. MarkLogic - 收集和索引
- 18. SSIS收集索引使用
- 19. 指定索引文檔集合整理
- 20. 如何索引我的收藏使用複合多鍵索引
- 21. Hiberante搜索和索引嵌入收集
- 22. 查找開始索引排序
- 23. 如何避免索引搜索返回的排序結果?
- 24. 修改合併排序用於存儲原始索引
- 25. 獲取排序的Numpy數組的原始索引
- 26. 在使用合併排序時保留原始索引c
- 27. 排序n維點和跟蹤原始索引
- 28. Groovy - 按屬性排序,然後按原始列表索引
- 29. 使用Linq時按原始索引重新排序
- 30. 我該如何連接按索引排列的數組索引?
這不是那麼簡單。假設我有這些集合(a和b)。如果我遍歷a,我怎麼在b中找到這個對象?我不能做indexOf(可能有兩個相等的矩形),而且無論如何這將是無效的。 – Draemon 2008-10-16 00:10:39
如果您正在通過排序集合進行搜索,只需將其作爲一個數組並進行二分搜索即可。O(lg n)。 – 2008-10-16 00:22:34