Mercurial > hg > Members > shoshi > jungle > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/traverser/RedBlackTreeInterfaceTraverser.java @ 308:201cc75a9984
change Red Black Tree Edit Path Extends
author | tatsuki |
---|---|
date | Thu, 26 Jan 2017 15:23:25 +0900 |
parents | src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/traverser/RedBlackTreeTraverser.java@a5f7565f3a4b |
children | 5b9a3bc593a7 |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.jungle.query.traverser; import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; import jp.ac.u_ryukyu.ie.cr.jungle.query.Query; import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.nodeiterator.DefaultNodeIterator; import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.nodeiterator.RedBlackTreeNodeIterator; import jp.ac.u_ryukyu.ie.cr.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode; import java.util.Iterator; public class RedBlackTreeInterfaceTraverser implements InterfaceTraverser { private TreeNode root; public RedBlackTreeInterfaceTraverser(TreeNode root) { this.root = root; } @Override public Index getIndex() { return null; //使わない 赤黒木は自身がIndexなので、特別なIndexは無い } @Override public ParentIndex getParentIndex() { return null; // 上に同じ、回転処理で構造が変わるため、自身の木構造でデータを表現しない、つまり親を知る必要はない } @Override public void createIndex() { // 上に同じ Indexを張る必要はない } @Override public void updateIndex(List<TreeNode> editedNodeList) { //上に同じ } @Override public void updateIndex(TreeNode subTreeRoot) { //上に同じ } @Override public Iterator<TreeNode> find(Query query) { //balanceKeyを使わない場合全探索なのでDefaultInterfaceTraverserと変わらない Iterator<TreeNode> nodeIterator = new DefaultNodeIterator(root); TreeNode firstMatchNode = null; for (; nodeIterator.hasNext(); ) { firstMatchNode = nextmatch(nodeIterator.next(), query); if (firstMatchNode != null) break; } final TreeNode finalFirstMatchNode = firstMatchNode; return new Iterator<TreeNode>() { TreeNode matchNode = finalFirstMatchNode; @Override public boolean hasNext() { if (matchNode == null) { return false; } return true; } @Override public TreeNode next() { TreeNode currentPair = matchNode; for (; nodeIterator.hasNext(); ) { matchNode = nextmatch(nodeIterator.next(), query); if (matchNode != null) return currentPair; } matchNode = null; return currentPair; } @Override public void remove() { } }; } @Override public Iterator<TreeNode> find(Query query, String key, String searchValue) { Iterator<TreeNode> nodeIterator = new RedBlackTreeNodeIterator(root,key,searchValue); TreeNode firstMatchNode = null; for (; nodeIterator.hasNext(); ) { firstMatchNode = nextmatch(nodeIterator.next(), query); if (firstMatchNode != null) break; } final TreeNode finalFirstMatchNode = firstMatchNode; return new Iterator<TreeNode>() { TreeNode matchNode = finalFirstMatchNode; @Override public boolean hasNext() { if (matchNode == null) { return false; } return true; } @Override public TreeNode next() { TreeNode currentPair = matchNode; for (; nodeIterator.hasNext(); ) { matchNode = nextmatch(nodeIterator.next(), query); if (matchNode != null) return currentPair; } matchNode = null; return currentPair; } @Override public void remove() { } }; } private TreeNode nextmatch(TreeNode node, Query query) { if (query.condition(node)) return node; return null; } }