// 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);
 }