2017-08-11 3 views
2

Je vais lire un contenu de fichier en tant qu'entrée pour mon programme. Je le stocke dans une chaîne et le partage en 2 cordes.Lire à partir d'un fichier et les analyser en différents tableaux

File file = new File("question.txt"); 
PrintWriter pw = new PrintWriter(file); 
pw.write("81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) (4,72.30,$76) (5,30.18,$9) (6,46.34,$48)"); 
pw.close(); 
BufferedReader br = new BufferedReader(new FileReader(file)); 
String line = br.readLine(); 
Map<Integer, Object> map = new HashMap<Integer, Object>(); 
int i = 0; 
Demo d = new Demo(); 
String[] part = line.split(":"); 
String part1 = part[0].trim(); 
String part2 = part[1].trim(); 

entrée:81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) (4,72.30,$76) (5,30.18,$9) (6,46.34,$48)

sortie:

totalWeight = 81; 
index[] = {1,2,3,4,5,6}; 
weight[] = {53.38,88.62,78.48,72.30,30.18,46.34}; 
value[] = {45,98,3,76,9,48}; 

la seconde chaîne contient 3 valeurs entre crochets. Le premier nombre est "Index", le deuxième nombre est "Poids" et le troisième nombre est "Valeur".
Comment puis-je le diviser et le stocker dans 3 tableaux différents?

Je connais une façon de le faire en l'analysant dans un objet d'une classe qui a 3 tableaux et leur assigner des valeurs.
Mais y a-t-il une meilleure façon de le faire?

Répondre

1
String[] part2 = part[1].replace("(", "").trim().split(")"); 
List<String> indices = new ArrayList<String>(); 
List<String> weights= new ArrayList<String>(); 
List<String> values = new ArrayList<String>(); 

for (String s : part2) 
{ 
    String item = s.split(","); 
    indices.add(item[0]); 
    weights.add(item[1]); 
    values.add(item[2]); 
} 

// to get them as arrays 
String[] allWeightsArray = weights.toArray(new String[]); ... 
+0

ils ne sont pas entre crochets. –

+0

J'ai ajouté l'entrée et la sortie ci-dessous. –

+0

Modifié ma réponse en fonction de vos données d'entrée/sortie –

1

Utilisez ce code pour analyser la chaîne dans ce format:

String[] structured = part2.replaceAll("[()]", "").split(" "); 

List<String> indexes = new ArrayList<>(); 
List<String> weights = new ArrayList<>(); 
List<String> values = new ArrayList<>(); 

for (String elem : structured) { 
    String[] parsed = elem.split(","); 
    indexes.add(parsed[0]); 
    weights.add(parsed[1]); 
    values.add(parsed[2]); 
} 
1

utilisation de la méthode split pour diviser la chaîne par [\(?+\\)]+\s+

String x = part[1].trim(); 
String[] items = x.split("[\\(?+\\)]+\\s+"); 
List<String> indexs = new ArrayList<>(); 
List<String> wights = new ArrayList<>(); 
List<String> values = new ArrayList<>(); 
for(String item : items) 
{ 
    item = item.replace("(" , "").replace(")" , "").trim(); 
    String[] partItems = item.split(","); 
    indexs.add(partItems[0]); 
    wights.add(partItems[1]); 
    values.add(partItems[2]); 
} 

System.out.println(Arrays.toString(indexs.toArray())); 
System.out.println(Arrays.toString(wights.toArray())); 
System.out.println(Arrays.toString(values.toArray())); 

sortie

[1, 2, 3, 4, 5, 6] 
[53.38, 88.62, 78.48, 72.30, 30.18, 46.34] 
[$45, $98, $3, $76, $9, $48] 
1

Vous pouvez résoudre votre problème en utilisant des modèles comme ceci:

String str = "81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) " 
    + "(4,72.30,$76) (5,30.18,$9) (6,46.34,$48)"; 

String regex = "\\((\\d+),(\\d+\\.\\d+),([^\\d](\\d+))\\)"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(str); 
double totalWeight = Double.parseDouble(str.replaceAll("^(\\d+).*", "$1")); 
List<Integer> indexes = new ArrayList<>(); 
List<Double> weights = new ArrayList<>(); 
List<Integer> valuess = new ArrayList<>(); 

while (matcher.find()) { 
    indexes.add(Integer.parseInt(matcher.group(1))); 
    weights.add(Double.parseDouble(matcher.group(2))); 
    valuess.add(Integer.parseInt(matcher.group(4))); 
} 

System.out.println(totalWeight);// 81.0 
System.out.println(indexes); // [1, 2, 3, 4, 5, 6] 
System.out.println(weights); // [53.38, 88.62, 78.48, 72.3, 30.18, 46.34] 
System.out.println(valuess); // [45, 98, 3, 76, 9, 48] 
  • Le poids total est le premier numéro de l'entrée pour que vous pouvez l'obtenir en utilisant seulement replaceAll parse alors l'entrée Double.parseDouble(str.replaceAll("^(\\d+).*", "$1"));
  • pour obtenir les informations autres que vous pouvez utiliser cette regex \((\d+),(\d+\.\d+),([^\d](\d+))\) (regex demo) qui peut correspondre aux trois numéros deffirent entre deux (), dans votre cas, vous avez beaucoup de résultats pour que vous puissiez utiliser des motifs.