Advertisement
Guest User

Untitled

a guest
Apr 19th, 2015
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. class SkipList<K extends Comparable<K>,V> extends AbstractMap<K,V> {
  4. private int size, levels;
  5. private Term current;
  6.  
  7. class Term implements Entry<K, V>{
  8.  
  9. private K key;
  10. private V value;
  11. private Term[] next;
  12.  
  13. private Term(K key, V value){
  14. this.key = key;
  15. this.value = value;
  16. this.next = new SkipList.Term[levels];
  17. }
  18.  
  19. @Override
  20. public K getKey() {
  21. return this.key;
  22. }
  23.  
  24. @Override
  25. public V getValue() {
  26. return this.value;
  27. }
  28.  
  29. @Override
  30. public V setValue(V value) {
  31. this.value = value;
  32. return value;
  33. }
  34.  
  35. public Term[] getNext() {
  36. return next;
  37. }
  38. }
  39. public SkipList(int levels){
  40. this.levels = levels;
  41. this.size = 0;
  42. this.current = new Term(null, null);
  43. }
  44.  
  45.  
  46. @Override
  47. public void clear() {
  48. this.size = 0;
  49. this.current = new Term(null, null);
  50. }
  51.  
  52. public V remove(K key){
  53. Term p[] = Skip(key);
  54. Term help = p[0].next[0];
  55. V temp = help.value;
  56. if(help == null || help.key.equals(key) == false) return null;
  57. for(int i = 0; i < levels && p[i].next[i] == help; p[i].next[i] = help.next[i], i++);
  58. size--;
  59. return temp;
  60. }
  61.  
  62. @Override
  63. public Set<Entry<K, V>> entrySet() {
  64. return new MyEntrySet();
  65. }
  66.  
  67. private class MyEntrySet extends AbstractSet{
  68. public Iterator<SkipList<K, V>> iterator(){
  69. return new MyIterator();
  70. }
  71.  
  72. private class MyIterator implements Iterator{
  73. private Term i = current;
  74. @Override
  75. public boolean hasNext() {
  76. return i.getNext()[0] != null;
  77. }
  78.  
  79. @Override
  80. public Term next() {
  81. i = i.getNext()[0];
  82. return i;
  83. }
  84.  
  85. @Override
  86. public void remove(){
  87. SkipList.this.remove(i.getKey());
  88. }
  89. }
  90.  
  91. @Override
  92. public int size() {
  93. return size;
  94. }
  95. }
  96.  
  97. public Term[] Skip(K key){
  98. Term[] p = new SkipList.Term[levels];
  99. Term x = current;
  100. for(int i = levels -1; i >= 0; i--){
  101. while(x.next[i] != null && x.next[i].key.compareTo(key) < 0){
  102. x = x.next[i];
  103. }
  104. p[i] = x;
  105. }
  106. return p;
  107. }
  108.  
  109. public V put(K key, V value){
  110. Term[] p = Skip(key);
  111. Term x = new Term(key, value);
  112. Random random = new Random();
  113. int i, randdigit = random.nextInt() * 2;
  114. if (p[0].next[0] != null && p[0].next[0].key == key) {
  115. V help = p[0].next[0].value;
  116. p[0].next[0].setValue(value);
  117. return help;
  118. }
  119. for(i = 0; i < levels && randdigit % 2 == 0; i++, randdigit >>= 2){
  120. x.next[i] = p[i].next[i];
  121. p[i].next[i] = x;
  122. }
  123. for(; i < levels;x.next[i] = null, i++);
  124. size ++;
  125. return null;
  126. }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement