[英]How to map unique ID,ID combos into legible numbered lines in Java
我想創建一種非遞歸的方式來創建類似於
1
1.1
1.2
1.2.1
1.3
2
2.1 etc etc (these items can be infinitely deep)
我唯一的識別信息是兩個數字的ID。 第一個ID是標識該項目的ID,第二個ID標識其所屬的項目,零始終是文檔根目錄。
例如:
123,0
456,123
789,123
777, 789
999, 123
888,0
444,888
將被翻譯成-
1
1.1
1.2
1.2.1
1.3
2
2.1
數據是內聯讀取的。 我不知道緊隨其后的是什么。 我認為這應該很簡單,但是由於某些原因,我很難找到一個有效的解決方案。 注意:項目將始終按順序排列。 例如,我永遠不會在獲得項目1.1之前獲得項目1.2,依此類推。
我的算法是:
(x, y)
,將x
作為y
的子代插入樹中 當然,這是一個非常籠統的草圖-就具體實現而言,有很多選擇!
如果物品以正確的順序排列,則可以疊放:
public class Item {
private int id;
private int parentId;
public Item(int id, int parentId) {
this.id = id;
this.parentId = parentId;
}
public int getId() { return id; }
public int getParentId() { return parentId; }
}
public class NumberedItem {
private Item item;
private int childCount;
private String number;
public NumberedItem(Item item, String number) {
this.item = item;
this.childCount = 0;
this.number = number;
}
public Item getItem() { return item; }
public String getNumber() { return number; }
/* package */ int incrementChildCount() {
return ++childCount;
}
}
public NumberedItemIterator implements Iterable<NumberedItem> {
private Iterator<Item> items;
private Stack<NumberedItem> numberStack;
public NumberedItemIterator(Iterable<Item> itemsIterable) {
items = itemsIterable.iterator();
numberStack = new Stack<NumberedItem>();
numberStack.push(new NumberedItem(null, null));
}
public boolean hasNext() {
return items.hasNext();
}
public NumberedItem next() {
Item current = items.next();
int parentId = current.getParentId();
NumberedItem parent = null;
while (!numberStack.empty()) {
NumberedItem candidate = numberStack.peek();
if (candidate.getItem().getId() == parentId) {
parent = candidate;
break;
}
numberStack.pop();
}
if (parent == null) throw new RuntimeException("Inconsistent ordering");
String number = Integer.toString(parent.incrementChildCount());
if (parent.getNumber() != null) {
number = parent.getNumber() + "." + number;
}
NumberedItem result = new NumberedItem(current, number);
numberStack.push(result);
return result;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.