2012-02-25 4 views
0

Я делаю простую программу рисования и застрял в получении определенной части строки. Вот и проблема. Когда я сохраняю изображение с 9 панелями, он сохраняет значения RBG каждой панели в файле .txt. Пример:Получение значений из строки

  1. java.awt.Color [г = 0, г = 0, B = 0]
  2. java.awt.Color [г = 255, G = 255, B = 255]
  3. java.awt.Color [г = 255, г = 0, B = 0]
  4. java.awt.Color [г = 0, г = 0, B = 255]
  5. java.awt.Color [г = 0, g = 0, b = 0]
  6. java.awt.Color [r = 255, g = 255, b = 0]
  7. java.awt.Color [r = 255, g = 255, b = 0]
  8. java .awt.Color [г = 255, г = 0, B = 0]
  9. java.awt.Color [г = 0, г = 0, B = 255]

Отсюда, я называю сканер, чтобы прочитать строки нашего файла. Мне просто нужно найти лучший способ извлечь значения внутри [] в String. Я пробовал использовать токенизатор безрезультатно, все еще застряв с лишними Строками. Я пробовал манипулировать символами, но снова не смог. Какой был бы лучший способ извлечь данные из наших скобок? И было бы легче хранить отдельные значения r = xxx, b = xxx, g = xxx для строки String []? Спасибо, и вот источник, который у меня есть до сих пор:

import java.awt.Color; 
import java.io.*; 
import java.lang.*; 
import java.util.*; 
//when finished, organize imports (narrow down what imports were used) 

public class SaveLoad { 

private boolean tryPassed, tryPassed2; 

private Formatter x; 
//final String[] rawData; will be where the rgb raws are stored 

private Scanner xReader; 

public void save(Color[] c, String s) { 
    //s is the filename 
    int counter = c.length; 

    //Tries to create a file and, if it does, adds the data to it. 
    try{ 
     x = new Formatter(s+".txt"); 
     tryPassed = true; 
     while(counter>0) { 
      x.format("%s. %s\n", (c.length-(counter-1)), c[counter-1]); 
      counter--; 
     } 
     x.close(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
     tryPassed = false; 
    } 
} 

//load will take paramaters of a filename(string); NOTE:::: make the file loaded specify an appendix (ex] .pixmap) 
//MAYBE add a load interface with a jDropdownmenu for the filetype? add parameter String filetype. 
public void load(String s, String filetype) { 
    //loads the file and, if successful, attempts to read it. 
    try{ 
     xReader = new Scanner(new File(s+filetype)); 
     tryPassed2 = true; 
    }catch(Exception e){ 
     e.printStackTrace(); 
     tryPassed2 = false; 
     System.out.println(s+filetype+" is not a valid file"); 
    } 
    while(xReader.hasNext()&&tryPassed2==true) { 
     String inBrackets = xReader.next().substring(17); 
     System.out.println(inBrackets); 
    } 
} 
} 

Также игнорируйте мои грязные обозначения.

+0

FYI, вы упустили самый важный тег: [tag: java]. –

+0

Embarrasing, исправил его примерно за минуту до публикации: S Спасибо xP – nolasaint

+0

Собственно, ваше исправление противоположно тому, что я имел в виду. Вместо добавления «(Java)» к вашему заголовку просто добавьте [tag: java] в теги в нижней части вопроса. Я уже исправил оба. –

ответ

2

Лучший способ - изменить формат хранения. Как минимум два варианта:

  • запятая-отдельные значения. Магазин r,g,b на каждой строке. Например, 215,222,213. Тогда вы можете иметь line.split(","), чтобы получить String[] из значений
  • сериализовать весь Color массив с помощью ObjectOutputStream
+0

Отделяющие ценности работали как шарм, спасибо тонне! – nolasaint

0

Я бы посоветовал изменить формат. Но если вы настаиваете на использовании одного регулярного выражения:

String st = "java.awt.Color[r=0,g=0,b=0]"; 
    Pattern p = Pattern.compile("java.awt.Color\\[r=(.*),g=(.*),b=(.*)\\]"); 

    Matcher m = p.matcher(st); 

    if (m.matches()) { 
     System.out.println("r=" + m.group(1)); 
     System.out.println("g=" + m.group(2)); 
     System.out.println("b=" + m.group(3)); 
    } 
Смежные вопросы