Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг строк (разбиение на слова), Со входного файла нужно вычленить числа 
:(
    Опции темы
akhalex38
  Дата 14.12.2013, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.12.2013

Репутация: нет
Всего: нет



Всем привет!
Ребята, в общем есть задача:
Входной файл, в которм заданы значения:

1234*2345=1344
327*362=678
Zakaz
78*67=32

Условие: до слова "Заказ" - это профили досок (каждая строка - одна доска), которые есть на складе ширина*длина=высота
После слова "Заказ" в том же формате, но уже задано то, что требует якобы заказчик. Программа должна вырезать требуемую доску из той, что есть со склада, и остатки вывести в выходной файл.


Разобрался с чтением файла, записать выходные данные смогу. Логику решения тоже проработаю. Проблема  следующем:

Сумел сделать парсинг текстового файла, отделив первую часть (до слова заказ) от второй. Теперь нужно разбить каждую строку на числа. Знаки разделения * и =

Числа каждой строки запистаь в отдельный массив strokaN, где N - порядковы номер строки и массива соответственно.

Во входном начальном файле может быть множество значений (неопределенно). Формат сохранится.

Кто чем может - помогите плиз! Препод заставляет сделать затачу, кто хочет автомат на зачет. Сам ничего не объяснял вообще. По Ява понимаю лишь цикл, условие, массивы. Потратив 4 дня наплел следующий код:

Код

package almazkin1;

import java.awt.List;
import java.io.*;
import java.nio.channels.*;
import java.nio.*;
import java.util.ArrayList;
import  java.io.*;
import java.util.*;

public class Almazkin {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

         String text;
         int ci=0;
         System.out.println("Введите имя файла");
         Scanner sc=new Scanner(System.in); 
         text=sc.nextLine();
         BufferedReader reader=new BufferedReader(new FileReader(text));     
         System.out.println ("На складе имеется:");
         int i=0; //переменная, необходимая для опредения длины массива
         while((text=reader.readLine())!=null) {
            // обработка очередной строки
          String a="0";
          a=text;
          ci=ci+1;
          i=i+1;
         // if (text.equals("Zakaz")) {
               //    System.out.println ("Заказано");
                //    ci=0;
               // } else {
                //    System.out.println ( "Позиция № "+ci+"; Размерности: "+text );
                //}
          
         }        
                  }
    }


Всем премного благодарен! Искренне, ребята! Всем спасибо! даже если не смогли помочь:)
Во вложении пример входного файла.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  test.txt 0,09 Kb
PM MAIL   Вверх
Revan199
Дата 15.12.2013, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.7.2010

Репутация: нет
Всего: нет



Привет, товарищ stolzen с javatalk, сказал тебе нужна помощь. 
Могу предложить следующий вариант
Код

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    private final String order = "Zakaz";
    private final Pattern profilePattern = Pattern.compile("(\\d+)\\*(\\d+)=(\\d+)");
    private List<Profile> profiles = new ArrayList<Profile>();
    private List<Profile> orderedProfiles;
    private final Comparator<Profile> profileComparator = new Comparator<Profile>() {
        @Override
        public int compare(Profile o1, Profile o2) {
            int w = o1.width - o2.width;
            int l = o1.length - o2.length;
            int h = o1.height - o2.height;
            if (w == 0) {
                if (l == 0) {
                    if (h == 0) {
                        return 0;
                    }
                    return h;
                }
                return l;
            }
            return w;
        }
    };

    /**
     * Метод который инициализирует профили из файла заданого пользователем
     */
    private void initProfiles() {
        profiles = new ArrayList<Profile>();
        orderedProfiles = new ArrayList<Profile>();
        System.out.println("Введите имя файла");
        Scanner sc=new Scanner(System.in);
        String filePath=sc.nextLine();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(filePath));
        } catch (FileNotFoundException e) {
            System.out.println("Указанный файл не найден");
            System.exit(0);
        }
        String line;
        List<Profile> currentList = profiles;
        try {
            while ((line = reader.readLine()) != null) {
                if (line.equals(order)) {
                    currentList = orderedProfiles;
                    continue;
                }
                Matcher m = profilePattern.matcher(line);
                if (!m.matches()) {
                    throw new IllegalArgumentException("Неверный формат файла испоьзуйте кнструкцию вида ширина*длина=высота");
                }
                int width = Integer.parseInt(m.group(1));
                int length = Integer.parseInt(m.group(2));
                int height = Integer.parseInt(m.group(3));
                currentList.add(new Profile(width, length, height));
            }
        } catch (IOException e) {
            System.out.println("Ошибка во время чтения файла");
            e.printStackTrace();
            System.exit(0);
        }
    }

    /**
     * Метод сортирует имеющиеся профили по убыванию, а заказанные по возрастанию
     */
    private void sortProfiles() {
        Collections.sort(profiles, profileComparator);
        Collections.sort(orderedProfiles, profileComparator);
        Collections.reverse(orderedProfiles);
    }

    private void solve() throws IOException {
        initProfiles();
        sortProfiles();
        for (Profile profile : orderedProfiles) {
            Profile goodProfile = findProfile(profile, profiles);
            if (goodProfile == null) {
                System.out.println("Профиль подходящего размеры для " + profile + " не был найден");
                continue;
            }
            profiles.remove(goodProfile);
            System.out.println("Вырезаем " + profile + " из " + goodProfile);
            List<Profile> newProfile = cut(goodProfile, profile);
            profiles.addAll(newProfile);
            System.out.println("Остатки, добавленые в имеющиеся профили " + newProfile);

            Collections.sort(profiles, profileComparator);
        }
        System.out.println("Остатки, после обработки профилей " + profiles);
    }

    /**
     * Метод Который вырезает из одного профиля другой. Отрезаем снчало по длине, потом по ширине и в конце по высоте
     * В идеальном случае, когда 2 профиля совпадают на выходе ничего не получим, в худшем случае получим 3 новых профиля
     * @param goodProfile - профиль из которого вырезается кусок
     * @param profile - профиль который вырезается
     * @return - либо ничего, если объекы совпадают, либо 1, 2 или 3 новых профиля
     */
    private static List<Profile> cut(Profile goodProfile, Profile profile) {
        List<Profile> result = new ArrayList<Profile>();
        int lengthDif = goodProfile.length - profile.length;
        int widthDif = goodProfile.width - profile.width;
        int heightDif = goodProfile.height - profile.height;
        if (lengthDif != 0) {
            result.add(new Profile(goodProfile.width, lengthDif, goodProfile.height));
            goodProfile.setLength(lengthDif);
        }
        if (widthDif != 0) {
            result.add(new Profile(widthDif, goodProfile.length, goodProfile.height));
            goodProfile.setWidth(widthDif);
        }
        if (heightDif != 0) {
            result.add(new Profile(goodProfile.width, goodProfile.length, heightDif));
        }
        return result;
    }


    /**
     * Метод котоый ищет среди всех профилей подходящий для заданного, то есть обладающего линейными
     * размерами больше чем у заданного, но наименьший среди всех
     *
     * @param orderedProfile - профиль для которого ищется подходящий
     * @param profiles       - список профилей которые просматриваются для сравнения
     * @return - минимальный профиль у которого все стороны боьше чем у orderedProfile, либо null если такого объекта нет
     */
    private static Profile findProfile(Profile orderedProfile, List<Profile> profiles) {
        for (Profile profile : profiles) {
            if (profile.width >= orderedProfile.width
                    && profile.length >= orderedProfile.length
                    && profile.height >= orderedProfile.height) {
                return profile;
            }
        }
        return null;
    }

    public static void main(String args[]) throws IOException {
        new Main().solve();
    }

    private static class Profile {
        private int width;
        private int length;
        private int height;

        Profile(int width, int length, int height) {
            this.width = width;
            this.length = length;
            this.height = height;
        }

        @Override
        public String toString() {
            return "Profiles{" +
                    "width=" + width +
                    ", length=" + length +
                    ", height=" + height +
                    '}';
        }

        int getWidth() {
            return width;
        }

        void setWidth(int width) {
            this.width = width;
        }

        int getLength() {
            return length;
        }

        void setLength(int length) {
            this.length = length;
        }

        int getHeight() {
            return height;
        }

        void setHeight(int height) {
            this.height = height;
        }
    }
}


Минусы 
- не оптимальный вариант вырезания профилей
- медленная скорость работы
P.S. 5 минут искал как тут залогиниться ещё 10 как отправить сообщение, пришлось извращаться через javascript
PM   Вверх
akhalex38
  Дата 15.12.2013, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.12.2013

Репутация: нет
Всего: нет



Цитата

Минусы 
- не оптимальный вариант вырезания профилей
- медленная скорость работы
P.S. 5 минут искал как тут залогиниться ещё 10 как отправить сообщение, пришлось извращаться через javascript 


Дружище, спасибо большое)) Огромное и человеческое! Спасибо и твоему товарищу, который про меня не забыл) Вы мне очень преочень помогли!) Век не забуду) Если что моя страница ВК
vk.com/info555
Нужна будет какая юридическая помощь в области дорожного движения - обращайся)
PM MAIL   Вверх
akhalex38
Дата 19.12.2013, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.12.2013

Репутация: нет
Всего: нет



Препод говорит: "Нужно разделить класс профиля и куска"... Понятия не имею о чем он. Если кто может, большая просьба: ткните меня носом, пожалуйста)
PM MAIL   Вверх
Magistrus
Дата 24.12.2013, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Жив
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 14.6.2006
Где: г. Одесса

Репутация: нет
Всего: 1



Если тебе еще актуально, я думаю тебе нужно создать класс Fragment, если я правильно понимаю  - это готовая продукция.  см метод cut
--------------------
~ вот такая вот загагулина ~ 
PM MAIL WWW ICQ Skype   Вверх
akhalex38
Дата 28.12.2013, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.12.2013

Репутация: нет
Всего: нет



Спасибо) Всё сдал на автомат) Вы лучшие)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.