chaine d'entier "csv-style" -> int[]

chaine d'entier "csv-style" -> int[] - Java - Programmation

Marsh Posté le 09-05-2003 à 19:14:16    

Yop,
 
J'ai une chaine du genre "123;12;-1;45;46;38;34;" (etc), que je reçois en fait sous forme de byte[] (si je fais new String(byteArr), j'obtiens la chaine que je viens de décrire)
Je voudrais en fait un tableau d'int.  
Je ne connais pas par avance le nombre d'élements. (tout ce que je sais c'est qu'il est supposé etre pair ce nombre)
 
A votre avis, la meilleure solution? :D
 
(ça me fait chier de passer par un ArrayList et de voir y insérer des Integer - les instanciers puis repasser par des intValue partout apres - mais un int[] n'est pas resizable....)
 
Je vois plusieurs façons, mais je laisse votre créativité voguer; comment feriez-vous? :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-05-2003 à 19:14:16   

Reply

Marsh Posté le 09-05-2003 à 19:30:20    

the real moins moins a écrit :

Yop,
 
J'ai une chaine du genre "123;12;-1;45;46;38;34;" (etc), que je reçois en fait sous forme de byte[] (si je fais new String(byteArr), j'obtiens la chaine que je viens de décrire)
Je voudrais en fait un tableau d'int.  
Je ne connais pas par avance le nombre d'élements. (tout ce que je sais c'est qu'il est supposé etre pair ce nombre)
 
A votre avis, la meilleure solution? :D
 
(ça me fait chier de passer par un ArrayList et de voir y insérer des Integer - les instanciers puis repasser par des intValue partout apres - mais un int[] n'est pas resizable....)
 
Je vois plusieurs façons, mais je laisse votre créativité voguer; comment feriez-vous? :D
 


 
passe par un vecteur alors ...
apres t utilise la methode copyInto...

Reply

Marsh Posté le 09-05-2003 à 19:34:09    

veryfree a écrit :


 
passe par un vecteur alors ...
apres t utilise la methode copyInto...

:sarcastic:
Si l'arraylist me fait un peu chier c'est surtout pask'on y fout des Object donc Integer dans mon cas et que ça me broute de devoir les instancier et faire des intValue dessus apres. c pas avec un vector que ça va changer :D
 
et pis pour parser le bordel. là j'utilise un StringTokenizer parce que j'ai plus de neurones, mais je me dit que c'est surement pas le plus leger dans mon cas (qui est hyper simple)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-05-2003 à 19:38:41    

Bon en fait là je fais

Code :
  1. StrigTokenizer tok = new StringTokenizer(machaine);
  2. int[] monarray = new int[tok.countTokens()];
  3. int pos = 0;
  4. while (tok.hasMoreTokens()){
  5.   monarray[pos] = Integer.parseInt(stok.nextToken));
  6.   pos++;
  7. }


 
 
c'est tres court et clair, mais ça me parait hyper lourdingue niveau perfs....
 
qqun a mieux?


Message édité par the real moins moins le 09-05-2003 à 19:39:00

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 01:02:32    

cte vieux bide [:sisicaivrai]
 
meme benou est pas passé :/
 
m'en fous je l'upperai lundi matin :p


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 11:54:30    

up :o
 
edit: tu m'as meme pas demandé mon avis [:ruisseau de larmes]
 
Edit2: je vois mal comment tu pourrais faire autrement hein ;) (enfin niveau perf)


Message édité par darklord le 10-05-2003 à 12:25:26

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 10-05-2003 à 12:24:42    

the real moins moins a écrit :

Code :
  1. StrigTokenizer tok = new StringTokenizer(machaine);
  2. int[] monarray = new int[tok.countTokens()];
  3. int pos = 0;
  4. while (tok.hasMoreTokens()){
  5.   monarray[pos] = Integer.parseInt(stok.nextToken));
  6.   pos++;
  7. }




bha c'est sur que là tu fais 2 parcour de la chaine, c'est pas top :/
 
mais bon, je rois pas qu'on puisse faire beaucoup mieux.
Par contre tu devrais filler le ';' comme separateur pour le String Tokenizer. Ca diminuera le nombre de test qu'il devra faire : new StringTokenizer(taChaine, ";" );
 
Et puis pour revenir sur l'idée du Vector, autant faire une LinkedList : ce serait plus performant.
 
 


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 12:25:03    

DarkLord a écrit :


edit: tu m'as meme pas demandé mon avis [:ruisseau de larmes]


et on peut le connaître ?  :o


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 12:26:30    

benou a écrit :


et on peut le connaître ?  :o  


 
bin en gros le tien :D sauf que j'ai pas mis l'accent sur le ; comme séparateur ;)
 
mais à mon avis il l'a mit mais il l'a oublié dans le code de son post


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 10-05-2003 à 13:40:57    

DarkLord a écrit :

up :o
 
edit: tu m'as meme pas demandé mon avis [:ruisseau de larmes]
 
Edit2: je vois mal comment tu pourrais faire autrement hein ;) (enfin niveau perf)

t'étais parti ;)
et niveau perf, bah si tu vois comment fonctionne un string tokenizer, c pas le plus leger pour juste parser un truc avec des entiers séparés par un char


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 13:40:57   

Reply

Marsh Posté le 10-05-2003 à 13:42:32    

benou a écrit :


bha c'est sur que là tu fais 2 parcour de la chaine, c'est pas top :/
 
mais bon, je rois pas qu'on puisse faire beaucoup mieux.
Par contre tu devrais filler le ';' comme separateur pour le String Tokenizer. Ca diminuera le nombre de test qu'il devra faire : new StringTokenizer(taChaine, ";" );
 
Et puis pour revenir sur l'idée du Vector, autant faire une LinkedList : ce serait plus performant.

euh voui en fait j'utilise ce constructeur, j'ai mal recopié (spa facile de faire un copier/coller entre 2 machines :o)
 
et pour la LinkedList, ça serait mieux qu'un ArrayList? J'y pense jamais moi à ces bêtes là :o
 
merci quand meme
 
y'a donc personne qui veut faire du parsing à la sauvage char par char? :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 13:42:57    

DarkLord a écrit :


 
bin en gros le tien :D sauf que j'ai pas mis l'accent sur le ; comme séparateur ;)
 
mais à mon avis il l'a mit mais il l'a oublié dans le code de son post

comment tu me connais trop bien :ouch:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 14:32:54    

the real moins moins a écrit :

y'a donc personne qui veut faire du parsing à la sauvage char par char? :D


allez, cadeau :  
 

Code :
  1. package divers;
  2. import java.util.*;
  3. public class bytesToInt {
  4. public static void main(String[] args) {
  5.  String s = "123;12;-1;45;46;38;34;";
  6.  byte[] byteTab = s.getBytes();
  7.  int begin =0;
  8.  int end=0;
  9.  SimpleLinkedList stockSepareted = new SimpleLinkedList();
  10.  // split tabByte  
  11.  while (true) {
  12.   end = byteTabSearch(byteTab, (byte) ';', begin);
  13.   if (end == -1) {
  14.    break;
  15.   }
  16.   stockSepareted.add(new String(byteTab, begin, end - begin));
  17.   begin = end + 1;
  18.  }
  19.  // put in a int[]
  20.  int[] intTab = new int[stockSepareted.size()];
  21.  Iterator it = stockSepareted.iterator();
  22.  int i = 0;
  23.  while (it.hasNext()) {
  24.   intTab[i++] = Integer.parseInt((String) it.next());
  25.  }
  26.  // display Result
  27.  for (i = 0; i < intTab.length; i++) {
  28.   System.out.println(intTab[i]);
  29.  }
  30. }
  31. private static int byteTabSearch(byte[] tab, byte searched, int from) {
  32.  for (int i = from; i < tab.length; i++) {
  33.   if (tab[i] == searched){
  34.    return i;
  35.   }
  36.  }
  37.  return -1;
  38. }
  39. }
  40. class SimpleLinkedList {
  41. private Elem first = null;
  42. private Elem last = null;
  43. private int size = 0;
  44. public java.util.Iterator iterator() {
  45.  return new Iterator(first);
  46. }
  47. public void add(Object obj) {
  48.  size++;
  49.  Elem newElem = new Elem(obj);
  50.  if (this.last == null) {
  51.   this.first = newElem;
  52.   this.last = newElem;
  53.  } else {
  54.   this.last.next = newElem;
  55.   this.last = newElem;
  56.  }
  57. }
  58. public int size() {
  59.  return size;
  60. }
  61. private static class Elem {
  62.  private Object value;
  63.  private Elem next = null;
  64.  public Elem (Object value) {
  65.   this.value = value;
  66.  }
  67. }
  68. private static class Iterator implements java.util.Iterator {
  69.  private Elem elem;
  70.  public Iterator(Elem firstElem) {
  71.   this.elem = firstElem;
  72.  }
  73.  public boolean hasNext() {
  74.   return elem != null;
  75.  }
  76.  public Object next() {
  77.   Object value = elem.value;
  78.   this.elem = this.elem.next;
  79.   return value;
  80.  }
  81.  public void remove() {
  82.   throw new UnsupportedOperationException();
  83.  }
  84. }
  85. }


ca doit pas être loin d'être optimal ...


Message édité par benou le 10-05-2003 à 14:33:21

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 14:51:05    

:love:
 
bon, et si Elem stockait directement un int au lieu d'un Object? :D
(parce qu'en fait si je me retrouve avec une IntLinkedList ou un int[] pour moi ça revient au meme:D)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 14:51:38    

etk merci bcp :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 14:54:33    

magnifique
 
 

Code :
  1. while (true) {
  2.            end = byteTabSearch(byteTab, (byte) ';', begin);
  3.            if (end == -1) {
  4.               break;
  5.            }

Reply

Marsh Posté le 10-05-2003 à 14:58:57    

++Taz a écrit :

magnifique
 
 

Code :
  1. while (true) {
  2.            end = byteTabSearch(byteTab, (byte) ';', begin);
  3.            if (end == -1) {
  4.               break;
  5.            }



bah euh quoi? [:gratgrat]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 15:18:43    


y a des gens qui aiment pas les while(true) ... [:spamafote]
 
quand c'est simple, j'évite moi aussi, mais quand je dois me faire chier à dupliquer du code (à mettre avant le while) ou triturer mon algo et le rendre imcompréhensible, ben je préfère faire un bête while (true) ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 15:20:10    

the real moins moins a écrit :

:love:
 
bon, et si Elem stockait directement un int au lieu d'un Object? :D
(parce qu'en fait si je me retrouve avec une IntLinkedList ou un int[] pour moi ça revient au meme:D)


ca je pouvais pas le savoir :)
 
vas-y, mon source est free ! :D


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 15:21:30    

benou a écrit :


y a des gens qui aiment pas les while(true) ... [:spamafote]
 
quand c'est simple, j'évite moi aussi, mais quand je dois me faire chier à dupliquer du code (à mettre avant le while) ou triturer mon algo et le rendre imcompréhensible, ben je préfère faire un bête while (true) ...


 
Ya pas do {} while en java ?  :sarcastic:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 10-05-2003 à 15:25:05    

Tetragrammaton IHVH a écrit :


 
Ya pas do {} while en java ?  :sarcastic:  


si mais ca convenait pas ...
 
edit : enfin ca aurait pu allr, mais je me tapais quand même le test du -1 => snul ! :o


Message édité par benou le 10-05-2003 à 15:25:40

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 15:31:51    

benou a écrit :


si mais ca convenait pas ...
 
edit : enfin ca aurait pu allr, mais je me tapais quand même le test du -1 => snul ! :o


 
C'est clair, rien de tel que la programmation "spaghetti" :lol:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 10-05-2003 à 15:32:23    

euh ouais t'aurais betement pu faire  
while (end!=-1) {
 ...
}
 
en fait [:dawa]
 
edit: ha ben non :o


Message édité par the real moins moins le 10-05-2003 à 15:32:56

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 15:54:12    

Tetragrammaton IHVH a écrit :


C'est clair, rien de tel que la programmation "spaghetti" :lol:


 :??:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 16:24:38    

puisque vous etes d humeur généreuse y en a pas un qui a déja créé une fonction qui convertis des secondes en
heure minute seconde ?
 
 :whistle:

Reply

Marsh Posté le 10-05-2003 à 16:29:44    

Calendar c = Calendar.getInstance;
c.setTimeInMillis(secondsTotal*1000);
int hours = c.get(Calendar.HOUR_OF_DAY);
int minutes = c.get(CALENDAR.MINUTE);
int secondes = c.get(CALENDAR.SECONDS);
 
qqch comme ça :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 16:30:49    

the real moins moins a écrit :

Calendar c = Calendar.getInstance;
c.setTimeInMillis(secondsTotal*1000);
int hours = c.get(Calendar.HOUR_OF_DAY);
int minutes = c.get(CALENDAR.MINUTE);
int secondes = c.get(CALENDAR.SECONDS);
 
qqch comme ça :D


 
non non :D
 
quelque chose qui te convertis  : 70 sec en 1 min et 10 sec ;)

Reply

Marsh Posté le 10-05-2003 à 16:32:53    

ben c'est exactement ce que ca fait, si tu rajoutes () à Calendar.getInstance bien sûr ;)


Message édité par benou le 10-05-2003 à 16:33:13

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 16:36:07    

j avait pas vu!
 
merci encore  
 
 
 :jap:

Reply

Marsh Posté le 10-05-2003 à 16:43:18    

benou a écrit :

ben c'est exactement ce que ca fait, si tu rajoutes () à Calendar.getInstance bien sûr ;)

:whistle:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 16:51:53    


 
si c etait la seule faute  :whistle:


Message édité par veryfree le 10-05-2003 à 16:52:08
Reply

Marsh Posté le 10-05-2003 à 16:52:46    

veryfree a écrit :


 
si c etait la seule faute  :whistle:

:heink:
 
je t'ai sorti ça de tête hein, sans doc ni éditeur ni compilo  :sarcastic:


Message édité par the real moins moins le 10-05-2003 à 16:53:12

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 16:54:38    

the real moins moins a écrit :

:heink:
 
je t'ai sorti ça de tête hein, sans doc ni éditeur ni compilo  :sarcastic:  


 
mais je sais arrete de monter sur tes grand cheveaux :D
jt aime bien c pour ca que je te provoque :o

Reply

Marsh Posté le 10-05-2003 à 16:56:13    

veryfree a écrit :


 
mais je sais arrete de monter sur tes grand cheveaux :D
jt aime bien c pour ca que je te provoque :o  

[:jm@rc]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 17:00:05    


la methode : setTimeInMillis(secondsTotal*1000); a un acces protected :/
 

Reply

Marsh Posté le 10-05-2003 à 17:03:00    

de tête, tu dois avoir un setTime() qui prend une Date en paramêtre et c'est date tu peux la contruire à partir d'un long (ton nombre de secondes)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 17:04:24    

tout à fait ;)
et y'a pas setTimeInMilliseconds?
ou bien tu peux ptet meme faire set(Calendar.SECONDS, 307072)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 17:11:59    

et arrete de pourrir mon topic d'abord :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2003 à 17:15:23    

the real moins moins a écrit :


ou bien tu peux ptet meme faire set(Calendar.SECONDS, 307072)


nan, c'est pas une bonne idée parce que de base le Calendar est instancié à la date courante => tu ne changeras que le champ secondes ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-05-2003 à 17:22:17    

benou a écrit :

de tête, tu dois avoir un setTime() qui prend une Date en paramêtre et c'est date tu peux la contruire à partir d'un long (ton nombre de secondes)


 
j ai de droles de resultats
 
 

Code :
  1. public static String getTimeString(long sec)
  2.  {
  3.   Calendar c = Calendar.getInstance();
  4.   c.setTime(new Date(sec));
  5.   int hours = c.get(Calendar.HOUR_OF_DAY);
  6.   int minutes = c.get(Calendar.MINUTE);
  7.   int secondes = c.get(Calendar.SECOND);
  8.   return (hours + ":"+ minutes + ":" + secondes );
  9.  }

 
 
avec 70 comme argument ca retourne 1:0:0
 
edit: avec 70 000 ca retourne 1:1:10 << ya juste le 1er "1" qui cloche :o


Message édité par veryfree le 10-05-2003 à 19:33:49
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed