Проблема с ArrayLists и чтением файла

У меня возникли трудности со следующим методом. Я не могу понять, в чем моя проблема, но я сузил ее до того, чтобы не заполнять список массивов из файла. Любая помощь приветствуется.

private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {

//create arraylists
ArrayList<String> model = new ArrayList<String>();
ArrayList<String> length = new ArrayList<String>();
ArrayList<String> width = new ArrayList<String>();
ArrayList<String> radius = new ArrayList<String>();
ArrayList<String> depth = new ArrayList<String>();
ArrayList<String> volume = new ArrayList<String>();
ArrayList<String> shape = new ArrayList<String>();

//fill arraylists from file
try {
    String outputline = "";

    BufferedReader fin = new BufferedReader(new FileReader("stock.dat"));
    while((outputline = fin.readLine()) != null)    {
       // for(int i = 0; i < outputline.length(); i++)    {
       int i = 0;

            //model
            boolean flag = false;
            String pass = "";
            while(flag = false) {
                if (outputline.charAt(i) != ',')
                    pass.concat(Character.toString(outputline.charAt(i)));

                else
                    flag = true;
                i++;
            }
            model.add(pass);

            //length
            flag = false;
            pass = "";
            while(flag = false) {
                if (outputline.charAt(i) != ',') 
                    pass.concat(Character.toString(outputline.charAt(i)));
                else
                    flag = true;
            }
            length.add(pass);

            //width
            flag = false;
            pass = "";
            while(flag = false) {
                if (outputline.charAt(i) != ',') 
                    pass.concat(Character.toString(outputline.charAt(i)));
                else
                    flag = true;
            }
            width.add(pass);

            //radius
            flag = false;
            pass = "";
            while(flag = false) {
                if (outputline.charAt(i) != ',') 
                    pass.concat(Character.toString(outputline.charAt(i)));
                else
                    flag = true;
            }
            radius.add(pass);

            //depth
            flag = false;
            pass = "";
            while(flag = false) {
                if (outputline.charAt(i) != ',') 
                    pass.concat(Character.toString(outputline.charAt(i)));
                else
                    flag = true;
            }
            depth.add(pass);

            //volume
            flag = false;
            pass = "";
            while(flag = false) {
                if (outputline.charAt(i) != ',') 
                    pass.concat(Character.toString(outputline.charAt(i)));
                else
                    flag = true;
            }
            volume.add(pass);

            //shape
            pass = "";
            for(int j = i; j < outputline.length(); j++)
                pass.concat(Character.toString(outputline.charAt(i)));
            shape.add(pass);
        }
    fin.close();
    }
catch(IOException e)    {
    System.err.print("Unable to read from file");
    System.exit(-1);

}

int at = -1;
for(int i = 0; i < model.size(); i++)   {
    if (model.get(i).equals(searchIn.getText())) {
        at = i;
        i = model.size();
    }
}
    Component frame = null;

if (at != -1)    {
    searchDepthOut.setText(depth.get(at));
    searchLengthOut.setText(length.get(at));
    searchRadiusOut.setText(radius.get(at));
    searchVolumeOut.setText(volume.get(at));
    searchWidthOut.setText(width.get(at));

}
else
    JOptionPane.showMessageDialog(null, "Your search did not return any results", "ERORR", JOptionPane.ERROR_MESSAGE);

}

Не могли бы вы выложить содержимое stock.dat. Если он длинный, не могли бы вы выделить линии, вызывающие проблему. Не могли бы вы рассказать нам, каково желаемое поведение?

jamesh 12.12.2008 05:44

Прошу прощения за это, но опубликованный вами код просто ужасен и требует отчаянного рефакторинга. Создайте класс для представления 7 свойств вместо 7 параллельных массивов и используйте String.split для анализа списка, разделенного запятыми.

Juliet 12.12.2008 05:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
515
4

Ответы 4

Помимо всех других проблем, которые люди перечислили ...

String pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
   pass.concat(Character.toString(outputline.charAt(i)));

pass - это строка. Строки неизменны. Ты хочешь

   pass = pass.concat(.....)

Разделите строку чтения запятой и покончим с этим. Я бы также создал объект для модели, длины, ширины и т. д., А затем имел бы 1 массив этого объекта.

while((outputline = fin.readLine()) != null)    {

    String[] tokens = outputline.split(",");
    if (tokens.length == 7){
        SObj o = new SObj; //Some Object

        o.model = tokens[0];
        o.length = tokens[1];
        //and so on

        oList.add(o);
    }
}

while(flag = false) никогда не будет запущен - он всегда оценивается как false. Попробуйте while (!flag)

Ответственные IDE должны пометить это назначение как логическое в условном.

Dov Wasserman 12.12.2008 08:19

IDE предназначены для облегчения работы, а не для повторного предположения кода. Это вполне допустимое условие, которое может быть здесь специально.

Feet 29.12.2008 11:36

Я предлагаю вам реструктурировать код. Проблема не только в том, что есть какая-то ошибка парсера, но и в том, что трудно сказать, что происходит - код явно делает предположения о структуре входной строки, но вам нужно как бы прочитать и отследить способ реструктурировать это в вашем сознании.

Что-то вроде

/** Expect a line of the form model, length, ...,
  return a list of ... 
*/
private String[] parse (String inputLine)
{
  //check input line charachteristics-not null, length, ...
  String out=  inputLine.split(",");
  if (out.length()!= ... 
  //whatever sanity checking...

}

private List<String[]> extract(BufferedReader fin)
{
  while((outputline = fin.readLine()) != null) 
 {
    //do something with parse(outputline);
  }
}

Полезно будет разделить чтение файла и синтаксический анализ строки, чтобы вместо того, чтобы делать все это в длинной последовательности, вы могли видеть, что ломается, скорее всего, предположение о структуре строк, которое скрыто в коде. Нужны ли ему 4 целых числа, разделенных запятыми? 5? как насчет того, чтобы они были заполнены пробелами? с префиксом пустой строки?

Другие вопросы по теме