Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.02 KB | None | 0 0
  1. import java.nio.CharBuffer;
  2. import java.text.Collator;
  3. import java.util.Comparator;
  4. import static java.nio.CharBuffer.wrap;
  5.  
  6. public class UnidadeComparador implements Comparator<Unidade>{
  7.  
  8.     private final Collator collator;
  9.  
  10.     public UnidadeComparador() {
  11.         collator = null;
  12.     }
  13.  
  14.     public int compare(final Unidade s1, final Unidade s2) {
  15.         final CharBuffer b1 = wrap(s1.getNome());
  16.         final CharBuffer b2 = wrap(s2.getNome());
  17.  
  18.         while (b1.hasRemaining() && b2.hasRemaining()) {
  19.             moverJanela(b1);
  20.             moverJanela(b2);
  21.             final int result = comparar(b1, b2);
  22.             if (result != 0) {
  23.                 return result;
  24.             }
  25.             preparaParaProximaInteracao(b1);
  26.             preparaParaProximaInteracao(b2);
  27.         }
  28.         return s1.getNome().length() - s2.getNome().length();
  29.     }
  30.  
  31.     private void moverJanela(final CharBuffer buffer) {
  32.         int start = buffer.position();
  33.         int end = buffer.position();
  34.         final boolean isNumerical = isDigito(buffer.get(start));
  35.         while (end < buffer.limit() && isNumerical == isDigito(buffer.get(end))) {
  36.             ++end;
  37.             if (isNumerical && (start + 1 < buffer.limit())
  38.                     && isZero(buffer.get(start)) && isDigito(buffer.get(end))) {
  39.                 ++start;
  40.             }
  41.         }
  42.         buffer.position(start).limit(end);
  43.     }
  44.  
  45.     private int comparar(final CharBuffer b1, final CharBuffer b2) {
  46.         if (isNumero(b1) && isNumero(b2)) {
  47.             return compararNumerico(b1, b2);
  48.         }
  49.         return compararStrings(b1, b2);
  50.     }
  51.  
  52.     private boolean isNumero(final CharBuffer buffer) {
  53.         return isDigito(buffer.charAt(0));
  54.     }
  55.  
  56.     private boolean isDigito(final char c) {
  57.         if (collator == null) {
  58.             final int intValue = (int) c;
  59.             return intValue >= 48 && intValue <= 57;
  60.         }
  61.         return Character.isDigit(c);
  62.     }
  63.  
  64.     private int compararNumerico(final CharBuffer b1, final CharBuffer b2) {
  65.         final int diff = b1.length() - b2.length();
  66.         if (diff != 0) {
  67.             return diff;
  68.         }
  69.         for (int i = 0; i < b1.remaining() && i < b2.remaining(); ++i) {
  70.             //final int result = Character.comparar(b1.charAt(i), b2.charAt(i));
  71.             final int result = Character.valueOf(b1.charAt(i))
  72.                     .compareTo(Character.valueOf(b2.charAt(i)));
  73.             if (result != 0) {
  74.                 return result;
  75.             }
  76.         }
  77.         return 0;
  78.     }
  79.  
  80.     private void preparaParaProximaInteracao(final CharBuffer buffer) {
  81.         buffer.position(buffer.limit()).limit(buffer.capacity());
  82.     }
  83.  
  84.     private int compararStrings(final CharBuffer b1, final CharBuffer b2) {
  85.         if (collator != null) {
  86.             return collator.compare(b1.toString(), b2.toString());
  87.         }
  88.         return b1.toString().compareTo(b2.toString());
  89.     }
  90.  
  91.     private boolean isZero(final char c) {
  92.         return c == '0';
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement