簡體   English   中英

排序巨大的數組列表(ArrayList <Class> )基於Java中類成員的值

[英]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.

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