2017-08-01 121 views
0

所以我有一個FlashCards的大LinkedList,1000卡,用於flashcard應用程序。有些以前從未見過,有些已經被看到過,並且多次猜測正確或不正確。使用比較器或多個比較器進行優先級排序?

有了這麼多的卡片,我想要那些我從來沒有注意到的名單上的第一個,其次是那些比他們被釘了更多的錯過。

理想情況下,這將是一般規則,並不總是如此;仍然會有一張我以前見過的偶爾卡片,但其中大多數卡片是看不見的。

另外,現在我正在使用Collections.shuffle(),在上述標準中,我仍然希望卡片隨機出現。

我剛熟了這個比較:

public class TimesSeenComparator implements Comparator<Card> { 
    public int compare(Card one, Card two){ 
     boolean oneNeverSeen = false; 
     boolean twoNeverSeen = false; 
     if(one.getMissed() + one.getMade() == 0){ oneNeverSeen = true; } 
     if(two.getMissed() + two.getMade() == 0){ twoNeverSeen = true; } 
     if(oneNeverSeen && twoNeverSeen){ return 0; } 

     if(one.getMissed() > two.getMissed()){ 
      return 1; 
     } else if(one.getMissed() == two.getMissed()){ 
      return 0; 
     } else{ 
      return -1; 
     } 
    } 

} 

它非常艱難,我知道!任何幫助表示讚賞。

編輯: 最後一個比較合作伙伴視其合同,我顯然是想在一個比較器中做太多。如果您有幾個比較器,然後執行Collections.sort(x,comp1),它將如何工作; Collections.sort(X,COMP2); Collections.sort(X,COMP3); ?

public class TimesSeenComparator implements Comparator<Card> { 
    public int compare(Card one, Card two){ 
     boolean oneNeverSeen = false; 
     boolean twoNeverSeen = false; 
     if(one.getMissed() + one.getMade() == 0){ oneNeverSeen = true; } 
     if(two.getMissed() + two.getMade() == 0){ twoNeverSeen = true; } 

     if(oneNeverSeen && !twoNeverSeen){ 
      return 1; 
     } else if(oneNeverSeen && twoNeverSeen){ 
      return 0; 
     } else { 
      return -1; 
     } 
    } 

} 
+0

能否請你澄清究竟是什麼你問題是? – MyStackRunnethOver

+2

也許分裂卡插入看見和看不見的清單和隨機排序兩種。然後,通過生成均勻分佈的數字填充最終列表,並選擇您希望它成爲看到的次數的百分比。就像'r> 0.95'一樣。 – ChiefTwoPencils

+0

那是一個好主意,我給它一個鏡頭。 – madmax

回答

1

我不知道你煮了比較那麼我要回答這個問題:

有了這麼多的卡我想,我從來沒有奠定眼睛的人就成爲第一位名單,然後是那些比他們被釘的更多的錯過。

理想情況下,這將是一般規則,並不總是如此;仍然會有一張我以前見過的偶爾卡片,但其中大多數卡片是看不見的。

下面的代碼會做你想要什麼:

List<Card> cards; 

List<Card> neverSeen = new ArrayList<>(); 
List<Card> missedMore = new ArrayList<>(); 
List<Card> other = new ArrayList<>(); 

for (Card card : cards) { 
    if (card.getMade() == 0 && card.getMissed() == 0) { 
     neverSeen.add(card); 
    } else if (card.getMissed() > card.getMade()) { 
     // Add about 1 in 10 to the beginning 
     if (Math.random() < 0.1) { 
      neverSeen.add(card); 
     } else { 
      missedMore.add(card); 
     } 
    } else { 
     // Add about 1 in 20 to the beginning 
     if (Math.random() < 0.05) { 
      neverSeen.add(card); 
     } else { 
      other.add(card); 
     } 
    } 
} 

Collections.shuffle(neverSeen); 
Collections.shuffle(missedMore); 
Collections.shuffle(other); 

neverSeen.addAll(missedMore); 
neverSeen.addAll(other); 

cards = neverSeen; 
注:
  • Collections.sort(X,COMP1); Collections.sort(X,COMP2); Collections.sort(X,COMP3);
    與Collections相同。排序(X,COMP3);
    如果你想使用多個比較可以使用ComparatorChain
    或Java 8 Comparator.comparing.thenComparing
  • 它幾乎總是更好(更快)使用ArrayList比LinkedList的
+0

我必須使用LinkedList,以便我可以poll() – madmax

+0

非常感謝你 – madmax

-1

考慮比較與收藏的基本的例子:

// Create and initialize linked list 
     LinkedList ll = new LinkedList(); 
     ll.add(new Integer(-8)); 
     ll.add(new Integer(20)); 
     ll.add(new Integer(-20)); 
     ll.add(new Integer(8)); 
// Create a reverse order comparator 
     Comparator r = Collections.reverseOrder(); 
// Sort list by using the comparator 
     Collections.sort(ll, r); 
     // Get iterator 
     Iterator li = ll.iterator(); 
System.out.print("List sorted in reverse: "); 
while(li.hasNext()) 
    System.out.print(li.next() + " "); 
System.out.println(); 
Collections.shuffle(ll); 
// display randomized list 
li = ll.iterator(); 
System.out.print("List shuffled: "); 
while(li.hasNext()) 
    System.out.print(li.next() + " "); 
System.out.println(); 
System.out.println("Minimum: " + Collections.min(ll)); 
System.out.println("Maximum: " + Collections.max(ll)); 

輸出將是:

enter image description here

同樣,你可以通過初始化像這樣使用多個類別:

// Create a reverse order comparator 
     Comparator r1 = Collections.reverseOrder(); 
     Collections.sort(ll, r1); 

     Comparator r2 = Collections.reverseOrder(); 
     Collections.sort(ll, r2); 

     Comparator r3 = Collections.reverseOrder(); 
     Collections.sort(ll, r3); 

並通過迭代器訪問它。它取決於你想用什麼方法。我在這裏使用reverseOrder(),但你可以根據你的邏輯使用。我希望這會幫助你。 謝謝!

+0

這不會以任何方式回答問題。 – Oleg