2010-06-09 5 views
2

Tenir compte de la chaîne suivante:split chaîne complexe en Java

5|12345|value1|value2|value3|value4+5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4+ 

Voici comment je veux diviser la chaîne, il divisé avec + donc j'obtenir ce résultat:

myArray[0] = "5|12345|value1|value2|value3|value4"; 

myArray[1] = "5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4"; 

si la chaîne a doesn ne pas contenir "?" char divisé avec "|" et continuer à la partie II, si la chaîne contient "?" divisé et pour chaque partie divisé avec "|" et continuer à la partie II.

Voici une partie II:

myObject.setAttribute1(newString[0]); 
... 
myObject.setAttribute4(newString[3]); 

Voici ce que j'ai jusqu'à présent:

private static String input = "5|12345|value1|value2|value3|value4+5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4+"; 

public void mapObject(String input){ 

String[] myArray = null; 

    if (input.contains("+")) { 
     myArray = input.split("+"); 
    } else { 
     myArray = new String[1]; 
     myArray[0] = input; 
    } 

    for (int i = 0; i < myArray.length; i++) { 

     String[] secondaryArray = null; 
     String[] myObjectAttribute = null; 

     if (myArray[i].contains("?")) { 
      secondaryArray = temporaryString.myArray[i].split("?"); 

      for (String string : secondaryArray) { 
       myObjectAttribute = string.split("\\|"); 
      } 
     } else { 
      myObjectAttribute = myArray[i].toString().split("\\|"); 
     } 

     myObject.setAttribute1(myObjectAttribute[0]); 
     ... 
     myObject.setAttribute4(myObjectAttribute[3]); 
        System.out.println(myObject.toString()); 
} 

Problème:

Lorsque je partage monTableau, creux pour aller avec monTableau [0], tout est bien monté comme il se doit.

Puis vient le myArray [1], sa scission en deux parties puis la seconde partie annule la valeur du premier (comment le savoir?). J'ai surchargé toString() méthode de myObject, quand j'ai fini j'imprime les valeurs de set ainsi je sais qu'il l'outrepasse, est-ce que quelqu'un sait comment je peux résoudre ceci?

Répondre

2

Le code ne semble pas être en mesure de gérer l'expansion possible des chaînes dans le cas secondaire. Pour rendre le code plus clair, j'utiliserais une liste plutôt qu'un tableau.

private static String input = "5|12345|value1|value2|value3|value4+5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4+"; 

private void split(List<String> input, List<String> output, String split) { 
    for (String s: input) { 
      if (s.contains(split)) 
      { 
      output.addAll(Arrays.asList(s.split(Pattern.quote(split))); 
      } 
      else 
       output.add(s); 
    } 
} 

MapObject public void (entrée String) {

List<String> inputSrings = new ArrayList<String>(); 
List<String> splitPlus = new ArrayList<String>(); 

inputStrings.add(input); 

split(inputStrings, splitPlus); 

List<String> splitQuest = new ArrayList<String>(); 
split(splitPlus, splitQuest, "?"); 

for (String s: splitQuest) { 
    // you can now set the attributes from the values in the list 
    // splitPipe 

    String[] attributes = s.split("\\|"); 
    myObject.setAttribute1(attributes[0]); 
    .... 
    myObject.setAttribute4(attributes[3]); 
    System.out.println(myObject); 
} 

}

+0

@mdma merci pour votre réponse, mais si cela ne tenait qu'à moi, je voudrais aussi utiliser la liste au lieu de tableau, mais je suppose que ce n'est pas une option .. désolé – ant

+0

comment venir listes non une option? Si les listes sont réellement disponibles, il est assez facile de recoder ceci pour utiliser des tableaux, c'est juste moins de code pour utiliser des listes. – mdma

+0

@mdma c'est ce que j'ai eu jusqu'ici j'ai juste besoin de le faire fonctionner, si ça ne tenait qu'à moi c'est vraiment plus élégant – ant

3

Je ne suis pas tout à fait sûr de ce que l'intention est là, mais dans ce bout de code

secondaryArray = temporaryString.split("?"); 

for (String string : secondaryArray) { 
    myObjectAttribute = string.split("\\|"); 
} 

si secondaryArray a deux éléments après l'opération de scission, vous itérez chaque moitié et réattribution myObjectAttribute à la sortie de string.split ("\ |") à chaque fois. Peu importe ce qui est dans le premier élément de secondaryArray, car après ce code s'exécute myObjectAttribute va contenir le résultat de split("\\|") sur le dernier élément dans le tableau.

De même, il est inutile d'appeler .toString() sur un objet String comme vous le faites dans temporaryString = myArray[i].toString().

+0

+1: Exactement ce que je voulais dire, me devança! –

+0

ce que j'essaye d'accomplir est parce que secondaryArray a 2 valeurs de chaîne, ainsi je veux que la première valeur l'assigne à myObjectAttribute ainsi je peux extraire et mapper mes attributs d'objet, et même chose pour la deuxième valeur du tableau. – ant

+0

'après ce code s'exécutera myObjectAttribute va contenir le résultat de split (" \\ | ") sur le dernier élément dans le tableau.' - oui j'ai remarqué cela comme je l'ai dit son override quand j'imprime myObject, comment Puis-je corriger cela, avez-vous compris ce que je voulais dire? Devrais-je ajouter plus d'explications?je vous remercie – ant