2017-02-09 10 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 над Array. advantages 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) будет использоваться для любого объекта в ArrayList в положении, обозначенном index. Также qset.size() дал бы вам размер arraylist.

2

Случайный доступ в LinkedList не имеет смысла для определения, поскольку каждый элемент связан только с его непосредственными соседями. Либо вы должны реализовать его самостоятельно с помощью итератора и случайных чисел, либо вместо этого вы можете использовать ArrayList (см. Пример here).

+1

Это действительно полезно. Спасибо. –

+1

LinkedList реализует интерфейс List, который определяет функцию get (int). Поэтому нет необходимости в собственной реализации с итератором для доступа к элементам в списке. – toongeorges

+0

Ну, ты прав. Но я предполагаю, что он использует итератор внутри себя, поэтому вы также можете использовать его. Однако это все еще очень неэффективно, поэтому я рекомендую ArrayList для прямого доступа к случайной позиции в списке. –

1

Вам лучше использовать ArrayList.

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

Вы можете использовать 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

Что делает Random с этим? Речь идет о случайном доступе, а не о последовательном доступе, а не о выборе случайного значения. – 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. 

Я понимаю что вы спрашиваете, можете ли вы получить доступ к элементу в связанном списке в постоянное время.

Это не то, для чего предназначен связанный список, он предназначен для удаления или вставки элемента в любое положение в постоянное время. Компромисс заключается в том, что выбор элемента в любой позиции не в постоянном, а в линейном времени.

Вот соответствующий код реализации LinkedList:

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); 
Смежные вопросы