IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

comment stocker et extraire des Entiers dans un String sans séparateurs ?


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Par défaut comment stocker et extraire des Entiers dans un String sans séparateurs ?
    Bonjour,

    Je souhaite stocker une série d'entiers sous forme de String sans séparateurs.

    exemple :
    un String S; qui contienne les 3 entiers suivants: 5, 12 et 3 sous cette forme: "5123".
    Il faudrait pouvoir les extraire après sans substring ni séparateur.
    "5123" ==> 5 12 3
    "45891"==> 4 589 1


    Y a t-il un moyen pour le faire (sachant qu'un String est un tableau de caractère) ?

    Merci.

    PS: J'en ai besoin pour stocker ces String(qui contiennent un série d'entiers) dans une "liste de String" qui contient des milliers d'éléments. Je veux accéder directement aux entiers (sans substring ni séarateur) pour accélérer le temps d'accès.

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    S'il n'y a pas de séparateur, on ne pourra jamais savoir si "5123" correspond à 5,12,3 ou 51,2,3 ou 5,1,23. Il faut soit un séparateur, soit connaire la taille de chacun des nombres.
    On pourrait utiliser une liste qui indique la taille de chaque chaine, mais je ne pense pas que les performances soient bien meilleures ainsi et il faudra de toute façon recourir au substring.

    D'ou viens cette liste? comment doit elle être utilisée? Un moyen de gagner en vitesse serait d'économiser la conversion string-entier en stoquant le nombre directement en binaire.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Par défaut
    Citation Envoyé par Uther Voir le message
    D'ou viens cette liste? comment doit elle être utilisée? Un moyen de gagner en vitesse serait d'économiser la conversion string-entier en stoquant le nombre directement en binaire.
    Non, en binaire ça ne convient pas au problème.
    Au fait, c'est super simple !
    Je lis une Table de faits en .CSV(base de données):
    Exemple: Table de Faits ( ici, nombre d'attributs =3 et nombre de lignes = 5)
    A B C
    5 1 3
    5 1 3
    5 1 4
    0 1 5
    0 0 5


    Je dois stocker les lignes (Sans doublons !) dans une structure de données.
    Voici la table à stocker : Taille = 4
    5 1 3
    5 1 4
    0 1 5
    0 0 5

    ----------------
    Voilà. (Bien sur en pratique il y aura des milliers de lignes)
    Et comme je lis le fichier en format .CSV. J'ai opté pour le String Tokenizer plutot que Substring (je ne sais pas si j'ai bien fait).
    Donc un Token contient 1 String représentant une valeur de la ligne. Bon je peux le convertir bien sur.

    Selon moi, l'idéal serait de stocker le cuboide de base dans une ArrayList : {5 1 3, 5 1 4, 0 1 5, 0 0 5} Mais quel objet dedans ???

    L'objet serait Soit :
    - un tableau de String
    - un tableau d'entiers.
    - une Liste de String (ce qui ferait une liste dans une liste)
    - un Liste d'entiers (même remarque préc.)
    - un Tableau de caractères = Un String !! <--- ce qui me semble être le plus léger, Mais comme vous me dites que c'est impossible sans séparateur, j'oublie




    >Enfin voilà, ce sera donc une Liste de quoi selon vous ?! Sachant que la vitesse est primordiale

    Merci.

    PS: Mais comme je connais à l'avance le taille de l'objet à stocker et que cette taille est fixe ( notre exemple: taille = nbre d'attributs = 3), je suis tenté d'utiliser un tableau plutot qu'une Liste.

  4. #4
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Si tu as juste à stocker les lignes différentes il ne me semble que tu peux simplement lire ton csv avec un BufferedReader (et sa méthode readLine()) et ensuite stocker toute la ligne en une seul String dans un Set.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Par défaut
    Citation Envoyé par Heimdal Voir le message
    Si tu as juste à stocker les lignes différentes il ne me semble que tu peux simplement lire ton csv avec un BufferedReader (et sa méthode readLine()) et ensuite stocker toute la ligne en une seul String dans un Set.
    Un Set, pourquoi pas une Liste c'est plus rapide non ?

    Je fais la lecture comme tu dis.
    Si c'est un String ça sera avec un séparateur. Donc il faudra le parcourir avec un SubString ou un Tokenizer ce qui est lourd non ? Surtout que je dois faire des millions de calcul sur cette table en accédant aux données de chaque String.

    Au fait le temps de calcul est au coeur de ce projet.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par NeoGeoo Voir le message
    Un Set, pourquoi pas une Liste c'est plus rapide non ?
    Un set garanti l'absence de doublon. Quand aux performances, si c'est critique, stocke chaque ligne sous la forme char[] plutot que String, rechercher la position des séparateurs est proportionnel à la longueur de la chaine (O(n))

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Un set garanti l'absence de doublon. Quand aux performances, si c'est critique, stocke chaque ligne sous la forme char[] plutot que String, rechercher la position des séparateurs est proportionnel à la longueur de la chaine (O(n))
    Ok !
    pour remlpir cette structure un Set serait parfait en effet. Mais :

    Après le remplissage, le gros du calcul consistera a accéder à cette structure en lecture (je dois faire près de [2 puissance nombre d'attributs] parcours). Dans mon exemple je dois parcourir cette table 8 fois.

    J'ai lu sur ce forum qu'une Arraylist est plus rapide qu'un HashSet, alors plutot Arraylist non ?

  8. #8
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    J'ai du mal à comprendre ce que tu dois stocker en base une fois que le csv a été parsé et que tu as une liste sans doublon. En relisant ca

    Exemple: Table de Faits ( ici, nombre d'attributs =3 et nombre de lignes = 5)
    A B C
    5 1 3
    5 1 3
    5 1 4
    0 1 5
    0 0 5

    Je dois stocker les lignes (Sans doublons !) dans une structure de données.
    Voici la table à stocker : Taille = 4
    5 1 3
    5 1 4
    0 1 5
    0 0 5
    Je ne comprends pas pourquoi tu veux tokenizer le contenu de chacune des lignes. Tu as des traitements a faire avec le contenu des vecteurs?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Par défaut
    Citation Envoyé par Heimdal Voir le message
    J'ai du mal à comprendre ce que tu dois stocker en base une fois que le csv a été parsé et que tu as une liste sans doublon. En relisant ca
    Je veux juste stocker les lignes de la table sans doublons.

    Je ne comprends pas pourquoi tu veux tokenizer le contenu de chacune des lignes. Tu as des traitements a faire avec le contenu des vecteurs?
    Oui, après stockage, je veux accéder à chaque élément de la ligne. Tu as une autre méthode ?

  10. #10
    Membre expérimenté Avatar de jiddou
    Inscrit en
    Août 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 247
    Par défaut
    Je pense que j'ai la solution de ton problème.
    Alors tu vas declarer un ArrayList de Vector:
    ArrayList<Vector<String>> list = new ArrayList<Vector<String>>();

    pour chaque ligne de ton csv tu vas construire un nouveau Vector à partir des token et l'ajouter à l' ArrayList si cette dernière ne le contient pas déjà.

    Vector<String> v1 = new Vector<String>();
    v1.add("1");
    v1.add("2");
    v1.add("3");
    if(!list.contains(v1))
    list.add(v1);

    Le code ci-dessous est un test que j'ai fais pour voir le retour de contains s'il s'agit d'un vector et effectivement il retourne false si tu laisse la dernière valeur de v2 à 5. si tu met 3 il retourne true

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    package tets;
     
    import java.util.ArrayList;
    import java.util.Vector;
     
    public class test {
    	public static void main(String[] args){
    		ArrayList<Vector<String>>  list = new ArrayList<Vector<String>>();
     
    		Vector<String> v1 = new Vector<String>();
    		v1.add("1");
    		v1.add("2");
    		v1.add("3");
     
    		Vector<String> v2 = new Vector<String>();
    		v2.add("1");
    		v2.add("2");
    		v2.add("5");
     
    		list.add(v1);
    		System.out.print(list.contains(v2));
    	}
    }
    Pour récupere l'element à la ligne i et position j c'est :
    list.get(i).get(j);

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Par défaut
    Citation Envoyé par jiddou Voir le message
    Je pense que j'ai la solution de ton problème.
    Alors tu vas declarer un ArrayList de Vector:
    ArrayList<Vector<String>> list = new ArrayList<Vector<String>>();

    pour chaque ligne de ton csv tu vas construire un nouveau Vector à partir des token et l'ajouter à l' ArrayList si cette dernière ne le contient pas déjà.

    Vector<String> v1 = new Vector<String>();
    v1.add("1");
    v1.add("2");
    v1.add("3");
    if(!list.contains(v1))
    list.add(v1);

    Le code ci-dessous est un test que j'ai fais pour voir le retour de contains s'il s'agit d'un vector et effectivement il retourne false si tu laisse la dernière valeur de v2 à 5. si tu met 3 il retourne true

    /**** CODE ****/

    Pour récupere l'element à la ligne i et position j c'est :
    list.get(i).get(j);
    ah !
    oui mais sur ce site il est déconseillé d'utiliser le vector: http://java.developpez.com/faq/java/...ECTIONS_vector

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Un set garanti l'absence de doublon. Quand aux performances, si c'est critique, stocke chaque ligne sous la forme char[] plutot que String, rechercher la position des séparateurs est proportionnel à la longueur de la chaine (O(n))
    Si j'utilise Un set ou une Arraylist de tableaux, la méthode .contains() ne marche pas car on ne peux pas comparer un tableau sans parcourir les éléments.

    Solution = mettre le tableau dans un objet et redéfinir la méthode equals() de cet objet ??

  13. #13
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    En effet prefere les Listes aux Vectors definitivement "has been".
    Niveau perf, j'aurai rien d'autre à te conseiller que de tester differentes implémentations et de comparer les temps d'exécution.

    Tu peux également tester une Map<String, TonObjet> qui t'évitera une recomposition des lignes.

    La clef serait la ligne (ex: "5 145 6") et la valeur un objet du genre
    public UnObjet(String[]).

    Ainsi pour chaque ligne ça donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    laMap.put(ligne, new UnObjet(ligne.split("\s")));
    La map supprime les doublons. Pour alimenter ta structure de données recupère la Collection de clefs (laMap.keySet() et pour tes traitements celle des valeurs (laMap.values().

    Bon courage et tiens nous au jus sur la solution aux meilleures perfs.

  14. #14
    Membre expérimenté Avatar de jiddou
    Inscrit en
    Août 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 247
    Par défaut
    Je ne sais pas si t'as bien vu la critique sur Vector mais il est dit que tu doit utiliser à la place la classe Arraylist Donc il suffit de changer lle vector avec ArrayList. Tu auras au finish un ArrayList d'ArrayList de String.
    Et mon exemple marche exactement de la meme manière qu'avec Vector.

  15. #15
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    Il y a une différence entre un Set et une List: c'est l'ordre des éléments ! Si tu veux conserver l'ordre original et juste éliminer les doublons le Set ne te va pas.

    En ce qui concerne l'objet à entrer dans ta liste, tu peux créer un objet qui a comme attribut un tableau de 3 entiers et redéfinir la méthode equals() et/ou compareTo() -- si tu veux le mettre dans un Set.

    L'implémentation de Set ou List à choisir dépend des accès que tu veux faire : accès direct (RandomAccess), insertion au milieu de la liste ou non, modification de la liste, recherche d'un élément dans la liste...

  16. #16
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par jean.2edi Voir le message
    Il y a une différence entre un Set et une List: c'est l'ordre des éléments ! Si tu veux conserver l'ordre original et juste éliminer les doublons le Set ne te va pas.
    C'est vrai si tu prend l'implémentation HashSet. Mais si tu prend le LinkedHashSet, tu combine l'avantage des List (ordre d'insertion préservé, accès au Nième élément) et de Set (unicité des éléments).

    Pour je suis tout à fait d'accord avec ton code (avec ArrayList plutot que Vector)

Discussions similaires

  1. Comment stocker des entiers dans un tableau ?
    Par ING KAM dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 04/07/2015, 13h55
  2. Comment stocker,et accéder à des BLOB Dans DB Sqlserver ?
    Par Meryjean dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/09/2010, 18h56
  3. Réponses: 6
    Dernier message: 10/10/2007, 23h26
  4. Stocker / Extraire des fichiers dans une base Access
    Par bryan_fury75 dans le forum Bases de données
    Réponses: 5
    Dernier message: 14/06/2006, 15h17
  5. Stocker des entiers dans Objects de TStrings
    Par Louis Griffont dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2006, 08h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo