2017-02-09 71 views
2

我有一個應該存儲問題的類,4個答案和1個正確的答案。隨機訪問Java中的鏈接列表

public class questionconstructor { 
String ques; 
String opt1; 
String opt2; 
String opt3; 
String opt4; 
String ans; 

questionconstructor(String q,String o1,String o2,String o3,String o4,String an) 
{ 
    ques=q; 
    opt1=o1; 
    opt2=o2; 
    opt3=o3; 
    opt4=o4; 
    ans=an; 
} 

} 

從主類我使用了一個鏈表中添加元素的類。

LinkedList<questionconstructor> qset = new LinkedList<questionconstructor>(); 

    qset.add(new questionconstructor("What is the fastest animal in the world?","Falcon","Cheetah","Fly","Puma","Cheetah")); 
    qset.add(new questionconstructor("What is the slowest animal in the world?","Tortoise","Turtle","Sloth","Crocodile","Tortoise")); 
    qset.add(new questionconstructor("What is the largest animal in the world?","Girrafe","Elephant","Whale","Mammoth","Whale")); 
    qset.add(new questionconstructor("What is the fastest car in the world?","Bugatti Veyron","Ferrari Enzo","SSC Ultimate Aero","Aston Martin DB7","Bugatti Veyron")); 
    qset.add(new questionconstructor("Which is of these buildings has a replica in Las Vegas?","Taj Mahal","Great Wall of China","Big Ben","Eiffel Tower","Eiffel Tower")); 

雖然我能夠順序調用這些使用迭代器,但有什麼辦法隨機訪問從列表中這些元素? P.S.我無法使用.get(int)函數。

+4

不要使用用於隨機訪問的列表。改爲使用數組類型的容器。 – Bathsheba

+0

鏈表的定義並不意味着這樣的工作。見維基百科:https://en.wikipedia.org/wiki/Linked_list – Chris

+0

有一個接口,'ArrayList'工具,但'LinkedList'沒有。該接口是...'RandomAccess'。 –

回答

2

對於隨機訪問LinkedList沒有做出來,它很好的使用基於數組的方法,它將爲您提供隨機訪問。

questionconstructor qset[] = new questionconstructor[size]; 

    qset[0] = new questionconstructor("What is the fastest animal in the world?","Falcon","Cheetah","Fly","Puma","Cheetah"); 
    qset[1] = new questionconstructor("What is the slowest animal in the world?","Tortoise","Turtle","Sloth","Crocodile","Tortoise"); 

//and many more items in you array like above 

然後你就可以訪問任何問題作爲qset[index],知道它的index。您可以使用ArrayList而不是Arrayadvantages of ArrayList over Array

ArrayList<questionconstructor> qset = new ArrayList<questionconstructor>(); 

    qset.add(new questionconstructor("What is the fastest animal in the world?","Falcon","Cheetah","Fly","Puma","Cheetah")); 
    qset.add(new questionconstructor("What is the slowest animal in the world?","Tortoise","Turtle","Sloth","Crocodile","Tortoise")); 

//and many more items in you array like above 

qset.get(index)將在由index表示位置被用於任何對象在數組列表。另外qset.size()會給你arraylist的大小。

2

根據定義,LinkedList中的隨機訪問沒有意義,因爲每個元素只鏈接到它的直接鄰居。要麼你必須用迭代器和隨機數自己實現它,要麼你可以使用ArrayList(例如參見here)。

+1

這真的很有幫助。謝謝。 –

+1

的LinkedList實現List接口,它定義了get(int)的功能。因此,不需要使用迭代器自己的實現來訪問列表中的元素。 – toongeorges

+0

那麼,你是對的。但我認爲它在內部使用迭代器,所以你也可以使用它。然而,這仍然是非常unperformant使用,所以我建議直接訪問該列表中的任意位置的ArrayList。 –

1

您最好使用ArrayList。可以使用qset.size()獲得列表中元素的數量。然後隨機訪問其中的一個。就像這樣:

int amount = qset.size(); 
Random rand = new Random(); 
int randomNumber = rand.nextInt(amount); 
questionconstructor randomQuestion = qset.get(randomNumber); 

你必須輸入java.util.Random這個

BTW:qset作爲名稱的列表和questionconstructor姓名一類是不是一個好的選擇

+0

隨機與此有什麼關係?問題是關於隨機訪問而不是順序訪問,而不是選擇隨機值。 – toongeorges

1
is there any way to randomly access these elements from the list? 
P.S. I am unable to use a .get(int) function. 

我明白你問你是否可以在一個固定的時間訪問一個鏈表中的元素。

這不是一個鏈表設計的目的,它的目的是允許在一個固定的時間在任何位置刪除或插入一個元素。權衡是在任何位置選擇元素不是一個常數,而是線性時間。

這裏是鏈表的相關實現代碼:列表中

if (index < (size >> 1)) { 
     Node<E> x = first; 
     for (int i = 0; i < index; i++) 
      x = x.next; 
     return x; 
    } else { 
     Node<E> x = last; 
     for (int i = size - 1; i > index; i--) 
      x = x.prev; 
     return x; 
    } 

元件不被隨機訪問順序訪問。

如果你想隨機訪問,鏈接列表轉換要麼陣列與

questionconstructor[] array = qset.toArray(new questionconstructor[qset.size()]); 

,或者一個ArrayList與

ArrayList<questionconstructor> arrayList = new ArrayList<>(qset);