2011-02-24 6 views
12

के लिए जावा तुलनाकर्ता मेरे पास बाइट [] कुंजी के साथ हैशैप है। मैं इसे एक TreeMap के माध्यम से सॉर्ट करना चाहता हूं।बाइट सरणी (लेक्सिकोग्राफिक)

लेक्सिकोग्राफिक आदेश के लिए तुलनित्र को लागू करने का सबसे प्रभावी तरीका क्या है?

उत्तर

19

Guava का उपयोग करके आप किसी का भी उपयोग कर सकते हैं:

UnsignedBytes तुलनित्र Unsafe कि इसे इस्तेमाल करता है, तो यह कर सकते हैं का उपयोग कर एक अनुकूलित प्रपत्र प्रतीत होता है। कोड में टिप्पणियां इंगित करती हैं कि यह सामान्य जावा कार्यान्वयन के रूप में कम से कम दोगुनी हो सकती है।

+0

हम "जावा" में समाधान है, यदि ऐसा है तो एक काम उदाहरण पोस्ट करें। – Deepak

+0

कॉलिन डी मेरे जवाब पर टिप्पणी में कहता है, मेरा समाधान गुवा में गैर अनुकूलित एक जैसा है। तो आप सीधे मेरा उपयोग कर सकते हैं, जो एक कामकाजी उदाहरण है, या कॉलिनडी के लिंक का पालन करें। – marcorossi

-2

आप एक तुलनित्र का उपयोग कर सकते हैं जो सरणी में प्रत्येक बाइट्स के Character.toLowerCase() को मानता है (बाइट [] एएससीआईआई में है) यदि आपको चरित्र को डीकोड करने या new String(bytes, charSet).toLowerCase() का उपयोग करने की आवश्यकता नहीं है, यह कुशल होने की संभावना नहीं है।

-1

मुझे लगता है कि समस्या सिर्फ "बाइट बनाम बाइट" तुलना के साथ है। सरणी से निपटना सीधा है, इसलिए मैं इसे कवर नहीं करूँगा। बाइट बनाम बाइट के संबंध में, तो मेरा पहला विचार यह करने के लिए है:

public class ByteComparator implements Comparator<byte> { 
    public int compare(byte b1, byte b2) { 
    return new Byte(b1).compareTo(b2); 
    } 
} 

लेकिन उस कोषगत नहीं होगा: 0xFF (-1 के लिए हस्ताक्षर किए बाइट) से छोटी 0x00 पर विचार किया जाएगा, जब कोषगत यह है बड़ा। मुझे लगता है कि इस चाल करना चाहिए:

public class ByteComparator implements Comparator<byte> { 
    public int compare(byte b1, byte b2) { 
    // convert to unsigned bytes (0 to 255) before comparing them. 
    int i1 = b1 < 0 ? 256 + b1 : b1; 
    int i2 = b2 < 0 ? 256 + b2 : b2; 
    return i2 - i1; 
    } 
} 

शायद वहाँ अपाचे के कॉमन्स-लैंग या यह करता है कि आम-गणित पुस्तकालयों में कुछ है, लेकिन मैं इसे बंद हाथ पता नहीं है।

15

अपाचे HBase में कोड का यह अच्छा टुकड़ा मिला:

public int compare(byte[] left, byte[] right) { 
     for (int i = 0, j = 0; i < left.length && j < right.length; i++, j++) { 
      int a = (left[i] & 0xff); 
      int b = (right[j] & 0xff); 
      if (a != b) { 
       return a - b; 
      } 
     } 
     return left.length - right.length; 
    } 
+0

यह मूल रूप से गुवा के 'UnsignedBytes.lexicographicalComparator() 'का गैर-अनुकूलित संस्करण क्या है। – ColinD

+1

हम्म, उन्होंने 'i' और' j' का उपयोग क्यों किया, जब एक चर पर्याप्त होता। साथ ही, 'int length = Math.min (left.length, right.length)' संग्रहित करना और 'i

+0

के लिए इसे बेहतर करेगा, आप उम्मीद करेंगे कि सरणी का लंबा क्षेत्र महंगा होगा – marcorossi

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^