Advertisement
tahg

Untitled

Jul 23rd, 2012
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. package org.bukkit.craftbukkit.util;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6.  
  7. public class LongHeap {
  8. long elements[] = new long[1];
  9.  
  10. private void swap(int i, int j) {
  11. long temp = elements[i];
  12. elements[i] = elements[j];
  13. elements[j] = temp;
  14. }
  15.  
  16. public synchronized int insert(long value) {
  17. elements[0]++;
  18. if (elements[0] == elements.length) {
  19. long tempElements[] = new long[elements.length * 2];
  20. System.arraycopy(elements, 0, tempElements, 0, elements.length);
  21. elements = tempElements;
  22. }
  23. elements[(int) elements[0]] = value;
  24. return bubbleUp();
  25. }
  26.  
  27. private int bubbleUp() {
  28. int index = (int) elements[0];
  29. int parent;
  30. while (index > 1) {
  31. parent = index >> 1;
  32. if (elements[index] < elements[parent]) {
  33. swap(index, parent);
  34. index = parent;
  35. } else
  36. break; // if we don't swap, we're done
  37. }
  38. return index;
  39. }
  40.  
  41. public long peekHead() {
  42. return elements[1];
  43. }
  44.  
  45. public long popHead() {
  46. long value = peekHead();
  47. removeHead();
  48. return value;
  49. }
  50.  
  51. public synchronized void removeHead() {
  52. remove(1);
  53. }
  54.  
  55. public synchronized void remove(int index) {
  56. if (index < 1 || index > elements[0])
  57. return;
  58. if (elements[0]-- != index) {
  59. swap(index, (int) (elements[0] + 1));
  60. bubbleDown(index);
  61. }
  62. }
  63.  
  64. private void bubbleDown(int index) {
  65. int count = (int) elements[0];
  66. while (true) {
  67. int left = index << 1;
  68. if (left == count) { // left child is last element
  69. if (elements[left] < elements[index])
  70. swap(index, left); // if child is smaller, swap
  71. return; // we have no more children so stop
  72. } else if (left < count) { // we have at least a right child
  73. int minChild = elements[left] < elements[left + 1] ? left : left + 1; // find minimum child
  74. if (elements[minChild] < elements[index]) { // and find minumum compared to parent
  75. swap(index, minChild);
  76. index = minChild;
  77. } else
  78. break; // we're finished if we didn't need to swap
  79. } else
  80. break;
  81. }
  82. }
  83.  
  84. public boolean isEmpty() {
  85. return elements[0] == 0;
  86. }
  87.  
  88. public void removeByCoord(int coord) {
  89. coord = coord << 16;
  90. for (int i = 1; i <= elements[0]; i++) {
  91. if ((int) (elements[i] & 0xFFFF0000) == coord) {
  92. remove(i);
  93. return;
  94. }
  95. }
  96. }
  97.  
  98. public byte[] toByteArray() {
  99. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  100. DataOutputStream dos = new DataOutputStream(bos);
  101.  
  102. try {
  103. for (int i = 1; i <= elements[0]; i++) {
  104. dos.writeLong(elements[i]);
  105. }
  106. } catch (IOException e) {
  107. // yes, out of memory, ./care
  108. } finally {
  109. try {
  110. dos.close();
  111. bos.close();
  112. } catch (IOException e) {
  113. }
  114. }
  115. return bos.toByteArray();
  116. }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement