Я пытаюсь преобразовать код С# в Java. Я почти переделал все, кроме трех строк в if
.
код С#
LinkedList<T> buk = new LinkedList();
LinkedListNode<T> current = buk.First;
LinkedListNode<T> previous = null;
if (fooCondition) {
previous = current.Previous;
} else {
previous = current;
current = current.Next;
}
Эквивалентный код Java
LinkedList<T> buk = new LinkedList<>();
T current = buckets.getFirst();
T previous = null;
if (fooCondition) {
? //previous = current.Previous;
} else {
? //previous = current;
? //current = current.Next;
}
Поскольку в Java нет класса LinkedListNode
, может ли кто-нибудь предположить, что будет эквивалентным кодом в Java?
РЕДАКТИРОВАТЬ
Кажется, что полный код очень важен для получения помощи. Вот функция С# из ссылки
protected void MergeBuckets()
{
LinkedListNode<Bucket> current = buckets.First;
LinkedListNode<Bucket> previous = null;
int k = (int)Math.Ceiling(1 / epsilon); // k=1/eps as integer
int kDiv2Add2 = (int)(Math.Ceiling(0.5 * k) + 2); // k/2 as integer
// at this point 1/k <= eps, k >= 2, hence requires eps >= 0.5
// number of concecutive buckets with same count causing a
// merge of the oldest two of those buckets
int numberOfSameCount = 0;
// traverse buckets from first to last, hence in order of
// descending timestamp and ascending count
while (current != null)
{
// previous and current bucket have same count, increment counter
if (previous != null && previous.Value.Count == current.Value.Count)
numberOfSameCount++;
// current is first with that count, reset counter to 1
else
numberOfSameCount = 1;
// detect need for a merge
if (numberOfSameCount == kDiv2Add2)
{
// merge buckets into current and remove previous
current.Value.Timestamp = previous.Value.Timestamp; // take most recent timestamp
current.Value.Count = previous.Value.Count + current.Value.Count; // sum the counts of the buckets,
// i.e. next power of two
buckets.Remove(previous);
// note that a merged bucket might cause a cascade of merges due to its new count,
// hence the new current node should point to the merged bucket otherwise the
// cascade might go unnoticed, temporarily violating the invariant!
previous = current.Previous; // merged bucket previous, since old previous is removed
//current = current; // trivial, merged bucket is new current
// at this iteration, the traversal stays in place
}
// no merge required, continue normally
else
{
previous = current; // old current bucket or merged bucket
current = current.Next; // current or merged next
// at this iteration, the traversal moves to the next (older) bucket
}
}
}
не можете ли вы использовать listIterator, предоставленный LinkedList, и использовать предоставленные методы для просмотра связанного списка
ListIterator<T> listIterator = linkedListNode.listIterator(0);
if(yourCondition && listIterator.hasNext()){
T next = listIterator.next();
}
else if (listIterator.hasPrevious()){
T previous = listIterator.previous();
}
Надеюсь, поможет
Класс Java java.util.LinkedList
имеет внутренний класс LinkedList.Node
который является private
. Node
в LinkedList
нельзя получить напрямую. Вместо этого обратитесь к методам List.indexOf(E)
и List.add(E, int)
или ListIterator
, чтобы вставлять элементы в определенные позиции.
final LinkedList<T> list = new LinkedList<>();
list.add(object1);
if (cond) {
list.add(object2, list.indexOf(object1));
} else {
list.addFirst(object2);
}
Часто используемая идиома для работы с LinkedList
в Java - это создание LinkedList
но в основном работает с ним с помощью ListIterator
.
final LinkedList<T> list = new LinkedList<>();
final ListIterator<T> iterator = list.listIterator();
if (!cond && list.hasNext()) {
list.next();
}
list.add(object2);
Вы можете написать собственную версию класса LinkedListNode
которая содержит previous
и next
как свойство property/field. Например -
class LinkedListNode{
LinkedListNode previous;
LinkedListNode next;
}
Затем добавьте метод getter и setter для доступа к свойству/полю. Вы можете добавить другое свойство/поле для хранения значения узла. Это базовая структура. Это может помочь вам. Возможно, вы также посмотрите на эту ссылку.
благодаря
Вы не можете создать LinkedList без узлов. К сожалению, ваш код не имеет смысла.
Узел LinkedList (в данном случае двусвязный) состоит из следующего узла, предыдущего и данных в узле, а также методов доступа. Это довольно просто реализовать, поскольку это просто структура хранилища данных.
class LinkedListNode<T> {
LinkedListNode prevNode, nextNode;
T data;
public LinkedListNode getNext() {
return nextNode;
}
public LinkedListNode getPrev() {
return prevNode;
}
public T getValue() {
return data;
}
public void setNext( LinkedListNode n ) {
nextNode = n;
}
public void setPrev( LinkedListNode n ) {
prevNode = n;
}
public void setValue( T data ) {
data = n;
}
}
LinkedList
без узлов. Класс LinkedList
позаботится о самих узлах внутри себя.
LinkedList<T> buk=new LinkedList<T>();
//make list
T current=buk.getFirst();
T previous=null;
if (fooCondition) {
previous = current.previous;
} else {
previous = current;
current = current.next;
}
и структура T:
Class T{
public T previous;
public T next;
//rest
}
T
есть getPrevious()
и getNext()
- как они связаны с LinkedList
? Как они должны работать?