// updates nodes in given TreeSet between node.getPosition() and position private void updatePositionNodeSet(PositionNode node, int position, TreeSet<PositionNode> set) { if (set.size() == 0) { return; } int oldPos = node.getPosition(); int diff = position - oldPos; SortedSet<PositionNode> posNodes; boolean containsNode = false; if (diff == 0) { return; } // remove node before decrementing or incrementing to prevent overwriting if (set.contains(node)) { containsNode = true; set.remove(node); } if (diff > 0) { posNodes = set.subSet(node, false, new PositionNode(position), true); List<PositionNode> pNodeList = new ArrayList<>(); for (PositionNode pos : posNodes) { pNodeList.add(pos); } // decrement posNodes for (PositionNode pos : pNodeList) { int p = pos.getPosition() - 1; updatePositionNode(pos, p, set); } } else { posNodes = set.subSet(new PositionNode(position), true, node, false); // create list to iterate in reverse order List<PositionNode> pNodeList = new ArrayList<>(); for (PositionNode pos : posNodes) { pNodeList.add(pos); } // increment elements of TreeSet in reverse order so // that no collisions occur - PositionNodes are incremented // into slot created by removing node for (int i = pNodeList.size() - 1; i >= 0; i--) { PositionNode pNode = pNodeList.get(i); int p = pNode.getPosition() + 1; updatePositionNode(pNode, p, set); } } if (containsNode) { node.setPosition(position); set.add(node); } }
// works only if moving node to final position does not move it across // another node in set private void updatePositionNode(PositionNode node, int position, TreeSet<PositionNode> set) { set.remove(node); node.setPosition(position); set.add(node); }