• 0.00

  • 0.00

  • ,

task20.task2002 | level20.lesson02.task02 Не могу до конца понять условие

Здравствуйте, господа форумчане. Долго уже ломаю голову, над тем, как же решить эту задачу. То есть код работает, ошибки не выдает, но не проходит проверку. А дело состоит в том, что я не могу до конца осмыслить, что от меня требует условие, а именно:

Читаем и пишем в файл: JavaRush
Реализуйте логику записи в файл и чтения из файла для класса JavaRush.
В файле your_file_name.tmp может быть несколько объектов JavaRush.
Метод main реализован только для вас и не участвует в тестировании.

То что выделено жирным, для меня загадка. То есть я не понимаю, что под этим подразумевается. Можете обьяснить, что от меня требуется и что меняет данное условие в save/load методах?

Код Solution класса:

package com.javarush.task.task20.task2002;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/* 
Читаем и пишем в файл: JavaRush
*/
public class Solution {
    public static void main(String[] args) {
        //you can find your_file_name.tmp in your TMP directory or fix outputStream/inputStream according to your real file location
        //вы можете найти your_file_name.tmp в папке TMP или исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
        try {
            File your_file_name = File.createTempFile("your_file_name", null);
            OutputStream outputStream = new FileOutputStream("/Users/mac/Documents/JavaRushTasks/2.JavaCore/src/com/javarush/task/task20/task2002/File1");
            InputStream inputStream = new FileInputStream("/Users/mac/Documents/JavaRushTasks/2.JavaCore/src/com/javarush/task/task20/task2002/File1");

            JavaRush javaRush = new JavaRush();
            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            User user = new User();
            user.setFirstName("Vangelis");
            user.setLastName("Kondratevi");
            user.setBirthDate(new Date());
            user.setMale(true);
            user.setCountry(User.Country.UKRAINE);
            javaRush.users.add(user);

            javaRush.save(outputStream);
            outputStream.flush();

            JavaRush javaRush1 = new JavaRush();
            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            User user1 = new User();
            user1.setFirstName("Andrei");
            user1.setLastName("Karpovich");
            user1.setBirthDate(new Date());
            user1.setMale(true);
            user1.setCountry(User.Country.OTHER);
            javaRush1.users.add(user1);

            javaRush1.save(outputStream);
            outputStream.flush();

            JavaRush loadedObject = new JavaRush();
            loadedObject.load(inputStream);
            //check here that javaRush object equals to loadedObject object - проверьте тут, что javaRush и loadedObject равны

            outputStream.close();
            inputStream.close();

        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with my file");
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with save/load method");
        }
    }

    public static class JavaRush {
        public List<User> users = new ArrayList<>();
        private static int objCount = 0;

        public void save(OutputStream outputStream) throws Exception {
            //implement this method - реализуйте этот метод
            PrintWriter writer = new PrintWriter(outputStream);
            String areUsersPresent = users != null ? "yes" : "no";
            writer.println(areUsersPresent);
            if(users != null) {
                int size = users.size();
                writer.println(size);
                for (int i = 0; i < size; i++) {
                    User user = users.get(i);
                    String firstName = user.getFirstName();
                    writer.println(firstName);
                    String lastName = user.getLastName();
                    writer.println(lastName);
                    String bd = new SimpleDateFormat("dd-MM-yyyy").format(user.getBirthDate());
                    writer.println(bd);
                    String isMale = user.isMale() ? "yes" : "no";
                    writer.println(isMale);
                    String country = user.getCountry().getDisplayedName();
                    writer.println(country);
                }
            }
            writer.flush();
        }

        public void load(InputStream inputStream) throws Exception {
            //implement this method - реализуйте этот метод
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String areUsersPresent = reader.readLine();
            if(areUsersPresent.equals("yes")){
                int size = Integer.parseInt(reader.readLine());
                if(size>0){
                    for (int i = 0; i < size; i++) {
                        User user = new User();
                        String firstName = reader.readLine();
                        user.setFirstName(firstName);

                        String lastname = reader.readLine();
                        user.setLastName(lastname);

                        Date bd = new SimpleDateFormat("dd-MM-yyyy").parse(reader.readLine());
                        user.setBirthDate(bd);

                        boolean isMale = reader.readLine().equals("yes");
                        user.setMale(isMale);

                        String countryStr = reader.readLine();
                        User.Country country;
                        if(countryStr.equals("Ukraine")){
                            country = User.Country.UKRAINE;
                        } else if(countryStr.equals("Russia")){
                            country = User.Country.RUSSIA;
                        } else {
                            country = User.Country.OTHER;
                        }
                        user.setCountry(country);
                        users.add(user);
                    }
                }
            }
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            JavaRush javaRush = (JavaRush) o;

            return users != null ? users.equals(javaRush.users) : javaRush.users == null;

        }

        @Override
        public int hashCode() {
            return users != null ? users.hashCode() : 0;
        }
    }
}


Код User класса:

package com.javarush.task.task20.task2002;

import java.util.Date;

public class User {
    private String firstName;
    private String lastName;
    private Date birthDate;
    private boolean isMale;
    private Country country;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public boolean isMale() {
        return isMale;
    }

    public void setMale(boolean male) {
        isMale = male;
    }

    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

    public static enum Country {
        UKRAINE("Ukraine"),
        RUSSIA("Russia"),
        OTHER("Other");

        private String name;

        private Country(String name) {
            this.name = name;
        }

        public String getDisplayedName() {
            return this.name;
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (isMale != user.isMale) return false;
        if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) return false;
        if (lastName != null ? !lastName.equals(user.lastName) : user.lastName != null) return false;
        if (birthDate != null ? !birthDate.equals(user.birthDate) : user.birthDate != null) return false;
        return country == user.country;

    }

    @Override
    public int hashCode() {
        int result = firstName != null ? firstName.hashCode() : 0;
        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
        result = 31 * result + (birthDate != null ? birthDate.hashCode() : 0);
        result = 31 * result + (isMale ? 1 : 0);
        result = 31 * result + (country != null ? country.hashCode() : 0);
        return result;
    }
}
  • ,

com.javarush.task.task19.task1918

Здравствуйте, ребят. Решил задачу, работает, но при попытке отправки на сервер пишет, что программа работала слишком долго и была закрыта. В чем проблема, можете обьяснить?

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

Условие:

Знакомство с тегами Считайте с консоли имя файла, который имеет HTML-формат.

Пример:
Info about Leela <span xml:lang=»en» lang=»en»><b><span>Turanga Leela </span></b></span><span>Super</span><span>girl</span>

Первым параметром в метод main приходит тег. Например, «span«. Вывести на консоль все теги, которые соответствуют заданному тегу. Каждый тег на новой строке, порядок должен соответствовать порядку следования в файле. Количество пробелов, n, r не влияют на результат. Файл не содержит тег CDATA, для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нет. Тег может содержать вложенные теги.

Пример вывода:
<span xml:lang="en" lang="en"><b><span>Turanga Leela</span></b></span> 
<span>Turanga Leela</span> 
<span>Super</span> 
<span>girl</span>


Шаблон тега:
<tag>text1</tag> 
<tag text2>text1</tag> 
<tag text2>text1</tag>


text1, text2 могут быть пустыми

Код:

package com.javarush.task.task19.task1918;
/* 
Знакомство с тегами
*/
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Solution {
    public static void main(String[] args) throws Exception {
        //Читаем имя файла и сам файл в строку
        String tag = args[0];
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String file = bf.readLine();
        FileInputStream fis = new FileInputStream(file);
        String fileContent = "";
        while (fis.available()>0){
            int data = fis.read();
            fileContent += (char) data;
        }
        //проходимся по всем сабстрингам с фиксированным конечным индексом и возврастающимся начальным индексом на +1
        //если сабстринг находит тэг начала или закрытия, вносит в соответствующий список его индекс (начальный)
        ArrayList<Integer> openList = new ArrayList<>();
        ArrayList<Integer> closeList = new ArrayList<>();
        String sub = fileContent;
        for (int i = 0; i < fileContent.length(); i++) {
            sub = fileContent.substring(i, fileContent.length());
            if(!openList.contains(sub.indexOf("<"+tag)+i) && sub.contains("<"+tag)){
                openList.add(sub.indexOf("<"+tag)+i);
            }
            if(!closeList.contains(sub.indexOf("</"+tag)+i) && sub.contains("</"+tag)){
                closeList.add(sub.indexOf("</"+tag)+i);
            }
        }
        //Вносим все значения индексов начало тэгов в один список и сортируем
        //Нужно для понятия, какой индекс тэга начала соответствует индекс тэга закрытия
        ArrayList<Integer> sortList = new ArrayList<>(openList);
        sortList.addAll(closeList);
        Collections.sort(sortList);
        //редактируем список индексов тэгов начала приводя его к длине обьедененного списка
        //и заполняя пробелы (места индексов тэгов закрытия) 0-ями (маркируем эти индексы)
        ArrayList<Integer> openSortList = new ArrayList<>();
        openSortList.addAll(sortList);
        for (int i = 0; i < openSortList.size(); i++) {
            if(!openList.contains(openSortList.get(i))){
                openSortList.set(i, 0);
            }
        }
        //редактируем список индексов тэгов закрытия приводя его к длине обьедененного списка
        //и заполняя пробелы (места индексов тэгов открытия) 0-ями (маркируем эти индексы)
        ArrayList<Integer> closeSortList = new ArrayList<>();
        closeSortList.addAll(sortList);
        for (int i = 0; i < closeSortList.size(); i++) {
            if(!closeList.contains(closeSortList.get(i))){
                closeSortList.set(i, 0);
            }
        }
        //находим пары открытия-закрытия и вносим в мапу.
        //число 0-ей в списке индексов тэгов закрытия служат маркером того, сколько позиций отделяют тэг открытия
        //от его пары, тэга закрытия. Если же на месте индекса тэга открытия 0, то цикл продолжается, пока не будет не равен 0.
        int count = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        outterLoop:
        for (int i = 0; i < openSortList.size(); i++) {
            for (int j = i; j < closeSortList.size(); j++) {
                if(closeSortList.get(j)==0){
                    count++;
                } else if(openSortList.get(i) != 0){
                    map.put(openSortList.get(i), closeSortList.get(i+1+2*(count-1)));
                    count=0;
                    continue outterLoop;
                } else{
                    continue outterLoop;
                }
            }
        }
        //выводим на экран сабстринг (так как индекс тэга закрытия его начальный индекс, находим его конечный индекс).
        for (Map.Entry<Integer, Integer> pair: map.entrySet()) {
            System.out.println(fileContent.substring(pair.getKey(), pair.getValue()+tag.length()+3));
        }
    }
}