Java Comparateur de tableau d'octets (lexicographique)
J'ai une table de hachage avec byte[] touches. J'aimerais faire le tri par le biais d'un TreeMap.
Quel est le moyen le plus efficace pour mettre en œuvre le comparateur pour l'ordre lexicographique?
OriginalL'auteur marcorossi | 2011-02-24
Vous devez vous connecter pour publier un commentaire.
À l'aide de Goyave, vous pouvez utiliser soit:
La
UnsignedBytes
comparateur semble avoir une forme optimisée à l'aide deUnsafe
qu'il utilise s'il se peut. Les commentaires dans le code indiquent qu'il peut être au moins deux fois plus rapide qu'un Java normal de mise en œuvre.Comme ColinD dit dans le commentaire de ma réponse, ma solution est la même que la non optimisé dans la Goyave. Ainsi, vous pouvez directement utiliser le mien, qui est un exemple de travail, ou de suivre ColinD de liens.
OriginalL'auteur ColinD
Trouvé ce beau morceau de code dans Apache Hbase:
UnsignedBytes.lexicographicalComparator()
.Hmm, pourquoi ont-ils utiliser
i
etj
, quand une variable aurait été suffisant. Par ailleurs, la conservationint length = Math.min(left.length, right.length)
et en comparanti < length
permettrait d'améliorer ce pour les grands tableauxvous vous attendriez à ce que le champ longueur de la matrice serait aussi cher
OriginalL'auteur marcorossi
Je suis en supposant que le problème est seulement avec le "byte vs octet" comparaison. Traiter avec les baies est simple, je ne vais pas le couvrir. À l'égard de l'octet vs octet, ma première pensée est pour ce faire:
Mais qui ne sera pas lexicographique: 0xFF (l'octet signé pour -1) sera considéré comme étant plus faible que 0x00, quand lexicographiquement il est plus grand. Je pense que cela devrait faire l'affaire:
Il y a probablement quelque chose dans Apache commons-lang ou des communes bibliothèques mathématiques qui fait cela, mais je ne sais pas hors de la main.
OriginalL'auteur Julius Musseau
Vous pouvez utiliser un comparateur qui comares le Personnage.toLowerCase() de chacun des octets du tableau (en Supposant que le byte[] est en ASCII) si non, vous aurez besoin de faire le personnage de décodage de vous-même ou utiliser
new String(bytes, charSet).toLowerCase()
mais ce n'est pas de chances d'être efficace.OriginalL'auteur Peter Lawrey