[JAVA] comment transformer un string en int

Fermé
paladin3 Messages postés 2 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 1 décembre 2006 - 29 nov. 2006 à 14:08
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 - 1 déc. 2006 à 09:28
Bonjour.
Je cherche à transformer une chaine quelconque en int.
En effet toute les réponses que j'ai vu jusqu'à présent donné la solution pour transformer une chaine du type "1000" en un int (utilisation du parseInt ou autre dans ce cas)

Hors la j'aurais besoin de transformer une chaine quelconque.
De plus il faudrait que la transformation puisse se faire dans les deux sens (qu'à partir du int je retrouve ma chaine) et que le tri de la chaine transformée en int soit le même que le tri alphanumérique.


J'ai besoin de cette manip car sous lucene le tri de résultat qui sont des chaines est le plus couteux en ressource alors que le tri d'int est un des moins couteux.
Les chaines que j'aurais besoin de transformé sont des chaines de 32 caractéres au maximum.

J'avais pensé à cette solution (mais elle est irréalisable) :
un tableau avec tous les caracteres avec un poids en fonction de l'ordre alphanumérique (par exemple a = 1, b= 2 etc)
Ensuite pour chaque caractere je fais la manip suivant :
total = 0; (initialisation)
total = total + ((poid du caractere)+10)*10puissance(33-rang du caractere)
Le +10 permet que chaque caractere prenne 2 chiffres ce qui permet de mieux s'y retrouver pour retransformer l'int en chaine.

Le problème est que pour une chaine de 32 caractères j'ai un int de taille 10puissance32...

Si vous avez une meilleure idée je suis preneur.
Merci d'avance
A voir également:

2 réponses

Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
30 nov. 2006 à 12:28
Il est mathématiquement impossible de conserver le tri.
En effet, prends le mot "a". Donnons lui une valeur, par exemple, 1.

Le premier mot, par ordre alphabétique, après "a" est : "aa". Donc, on lui donne la valeur 2. Le 3e est bien "aaa", etc.
Si tu continues comme ça, tu verras que tu ne pourras JAMAIS atteindre la lettre "b". Tous les nombres vont être utilisés pour les "a"... Tu n'obtiendras même pas "aaab". Autant dire le début de l'ordre alphabétique !
Cela vient en fait du caractère "discret" de l'ensemble des entiers (il y a un nombre fini d'entiers entre deux nombres). Dans la plupart des n'est pas le cas de l'ensemble des mots... (En fait, "la plupart des cas" représente tous les mots qui contiennent plus d'une lettre distincte)

Ca parrait noir, comme ça, mais... je pars d'un postulat, c'est que tu as un ensemble de chaines possibles infinies. Si tel n'est pas le cas, alors tu peux te créer une table de Hash : tu prends toutes les chaines potentielles que tu es à même d'avoir à utiliser, tu les tries, tu leur associes un numéro.
Tu n'as besoin de faire ça qu'une fois, au chargement de ton programme par exemple.
Ensuite, passe par cette table à chaque fois que tu veux faire des tris ou autre...

Voilà, j'espère t'avoir éclairé, je sais que ça reste très théorique comme réponse... Bon courage !

Xavier
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
30 nov. 2006 à 16:20
Re-bonjour,

En fait, je viens de voir que tu te limitais à des chaînes de 32 caractères, donc à un dictionaire fini... Il est donc possible de trouver une fonction qui permette de conserver le classement.
Par contre, une bijection évidente serait (presque) celle que tu as suggérée (sauf que tu te places en base 10, alors qu'il faudrait le faire en base 26). Mais comme tu l'as judicieusement fait remarquer, le coût est exorbitant.

Sincèrement, je ne suis pas sûr que ce genre de fonction t'apporte le moindre gain : certes, trier des entiers est plus rapide que trier des chaînes (plus exactement, c'est la comparaison de valeurs qui est plus lente, mais l'algo de tri derrière est surement le même), mais cette différence est trop fine pour qu'on puisse "patcher" le tri des entiers pour trier des chaines et rester plus efficace que le tri d'entiers... Et si c'était faisable, ce serait surement implémenté ;)

Xavier
0
paladin3 Messages postés 2 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 1 décembre 2006 > Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
1 déc. 2006 à 09:11
Je m'en doutais un peu...
Bon tant pis :(
Je vais tenter une optimisation du code (elle est faite) et peut etre qu'en augmentant les performances de mon serveur je gagnerais les précieuses secondes qu'il me manque.
Ou alors je tenterais une autre approche (couper mes index en plusieurs morceaux par exemple pour limiter la taille)
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
1 déc. 2006 à 09:28
Bonjour,

excuse moi mais je n'ai abosluement rien compris à ton problème.

Ne te serait-il pas possible de mettre un exemple de fonctionnement de ton programme pour qu'un puisse comprendre?
-1