[英]Sorting huge Array List (ArrayList<Class>) based on values of class members in Java
有兩個子問題。
1-比較兩個巨大的數組列表
2-根據其對象的值對arraylist的元素進行排序,以實現(1)。
我有一個類的對象的ArrayList。 即
Class X
{
double x;
double y;
int sortVal;
}
ArrayList<X> alX = new ArrayList<X>(); //size = 10,000
ArrayList<Integer> myValue = new ArrayList<Integer>(); //size = 15
我想檢查myValue是否存在於sortVal中。
X ob = new X();
for(i=0;i<myValue.size();i++)
{
for(j=0;j<alX.size();j++)
{
ob = alX.get(j)
**if (myValues.get(i) == ob.sortVal)**
}
}
由於數組列表“ alX”的大小很大,因此需要大量的計算時間。
我認為更好的方法是根據X類的sortVal值對ArrayList alX的元素進行排序。通過排序,一旦sortVal大於myValue,我就可以擺脫循環。
1)如何基於值“ sortVal”對arraylist alX的元素進行排序。
2)有沒有比對數組列表排序更好的方法來比較兩個值。 即(myValues.get(i)== alX.ob.sortVal)
[edit]考慮值是,
ArrayList<X>:
x : 1,1,1,2,3,5,4,5
y : 2,4,6,4,4,6,2,1
sortVal: 10,20,30,10,10,20,30
ArrayList<Integer>:
myValue: 10,20,30
如果sortVal值唯一Map<Integer, X>
可以構造Map<Integer, X>
如果不是Map<Integer, X>
可以構造Map<Integer, Lists<X>>
。 它的時間復雜度為O(n)或O(n * log n),這是進行排序的成本。
編輯:這將一次構建鍵的MultiMap和該鍵的對象集。
List<X> xs = ...
Map<Integer, Set<X>> mapBySortVal = new LinkedHashMap<>();
for(X x: xs) {
Set<X> set = mapBySortVal.get(x.sortVal);
if (set == null)
mapBySortVal.put(x.sortVal, set = new LinkedHashSet<>());
set.add(x);
}
for(Integer value: myValues) {
Set<X> xs = mapBySortVal.get(value);
if (xs != null)
// found some.
}
對於第一個問題,您可以通過指定應該使用的Comparator
對可以想到的任何內容進行排序(請參閱Collections#sort
)
由於您將字段命名為sortVal
,因此我猜想可以根據該值對此類的實例進行排序,並且您可能想為該類實現Comparable
接口。 這樣,您可以使用Collections#sort
而不必指定Comparator
Google番石榴具有非常有用的功能。 對於數組的排序,它提供com.google.common.collect.Ordering<T>
。
例如:
Ordering<String> byLengthOrdering = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
List<String> sorted = byLengthOrdering.reverse().sortedCopy(sourceList);
根據您的要求,有2種方法:使用地圖,默認情況下按自然順序對其元素進行排序。 但是會占用更多的內存。
要么
使用比較器排序。 需要更多時間。
只需查看他們的文檔即可獲得解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.