Смотритель: hubert
  • ,

task33.task3310 - Задание 10.

Shortener (10)


Создай и реализуй класс FileStorageStrategy. Он должен:
10.1. Реализовывать интерфейс StorageStrategy.
10.2. Использовать FileBucket в качестве ведер (англ. bucket).
Подсказка: класс должен содержать поле FileBucket[] table.
10.3. Работать аналогично тому, как это делает OurHashMapStorageStrategy, но удваивать количество ведер не когда количество элементов size станет больше какого-то порога, а когда размер одного из ведер (файлов) стал больше bucketSizeLimit.
10.3.1. Добавь в класс поле long bucketSizeLimit.
10.3.2. Проинициализируй его значением по умолчанию, например, 10000 байт.
10.3.3. Добавь сеттер и геттер для этого поля.
10.4. При реализации метода resize(int newCapacity) проследи, чтобы уже не нужные файлы были удалены (вызови метод remove()).
Проверь новую стратегию в методе main(). Учти, что стратегия FileStorageStrategy гораздо более медленная, чем остальные. Не используй большое количество элементов для теста, это может занять оооочень много времени.
Запусти программу и сравни скорость работы всех 3х стратегий.

Требования:
1. Класс FileStorageStrategy должен поддерживать интерфейс StorageStrategy.
2. В классе FileStorageStrategy должны быть созданы все необходимые поля (согласно условию задачи).
3. Методы интерфейса StorageStrategy должны быть реализованы в FileStorageStrategy таким образом, чтобы обеспечивать корректную работу Shortener созданного на его основе.

Последнее требование ни в какую не хочет выполняться.
Да и второе зачлось только когда добавил некое мифическое поле (о котором нигде ни слова кроме как на help.javarush.ru) private long maxBucketSize
Перечитал все вопросы по этой подзадаче тут и на help.javarush.ru. Прошелся поиском по github-у (не нашел ни одного коммита решенной задачи для новой версии).

package com.javarush.task.task33.task3310.strategy;

import java.util.Objects;
import java.util.stream.IntStream;

public class FileStorageStrategy implements StorageStrategy {
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    private static final long DEFAULT_BUCKET_SIZE_LIMIT = 10000;
    private FileBucket[] table = new FileBucket[DEFAULT_INITIAL_CAPACITY];

    private long bucketSizeLimit = DEFAULT_BUCKET_SIZE_LIMIT;
    private int size;
    private long maxBucketSize;

    public FileStorageStrategy() {
        for (int i = 0; i < table.length; i++) {
            table[i] = new FileBucket();
        }
    }

    public long getBucketSizeLimit() {
        return bucketSizeLimit;
    }

    public void setBucketSizeLimit(final long bucketSizeLimit) {
        this.bucketSizeLimit = bucketSizeLimit;
    }

    public int getSize() {
        return size;
    }

    public long getMaxBucketSize() {
        return maxBucketSize;
    }

    private int hash(int h) {
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

    private int indexFor(final int hash, final int length) {
        return hash & (length - 1);
    }

    private Entry getEntry(final Long key) {
        final int hash = (key == null) ? 0 : hash(key.hashCode());
        final int index = indexFor(hash, table.length);

        for (Entry e = table[index].getEntry(); e != null; e = e.next) {
            final Long eKey = e.key;
            if (e.hash == hash && Objects.equals(key, eKey))
                return e;
        }
        return null;
    }

    private void resize(final int newCapacity) {
        final FileBucket[] newTable = IntStream
                .range(0, newCapacity)
                .mapToObj(i -> new FileBucket())
                .toArray(FileBucket[]::new);
        transfer(newTable);
        table = newTable;
        maxBucketSize = 0;
        for (final FileBucket bucket : table) {
            final long currentBucketSize = bucket.getFileSize();
            maxBucketSize = currentBucketSize > maxBucketSize ? currentBucketSize : maxBucketSize;
        }
    }

    private void transfer(final FileBucket[] newTable) {
        for (final FileBucket bucket : table) {
            Entry e = bucket.getEntry();
            while (e != null) {
                final Entry next = e.next;
                final int index = indexFor(e.hash, newTable.length);
                e.next = newTable[index].getEntry();
                newTable[index].putEntry(e);
                e = next;
            }
            bucket.remove();
        }
    }

    private void addEntry(final int hash, final Long key, final String value, final int bucketIndex) {
        final Entry e = table[bucketIndex].getEntry();
        table[bucketIndex].putEntry(new Entry(hash, key, value, e));
        size++;

        final long currentBucketSize = table[bucketIndex].getFileSize();
        maxBucketSize = currentBucketSize > maxBucketSize ? currentBucketSize : maxBucketSize;
        if (maxBucketSize > bucketSizeLimit) resize(2 * table.length);
    }

    private void createEntry(final int hash, final Long key, final String value, final int bucketIndex) {
        table[bucketIndex].putEntry(new Entry(hash, key, value, null));
        size++;
        final long currentBucketSize = table[bucketIndex].getFileSize();
        maxBucketSize = currentBucketSize > maxBucketSize ? currentBucketSize : maxBucketSize;
    }

    @Override
    public boolean containsKey(final Long key) {
        return getEntry(key) != null;
    }

    @Override
    public boolean containsValue(final String value) {
        for (final FileBucket bucket : table) {
            for (Entry e = bucket.getEntry(); e != null; e = e.next) {
                if (Objects.equals(e.value, value))
                    return true;
            }
        }
        return false;
    }

    @Override
    public void put(final Long key, final String value) {
        final int hash = (key == null) ? 0 : hash(key.hashCode());
        final int index = indexFor(hash, table.length);

        if (table[index].getEntry() != null) {
            for (Entry e = table[index].getEntry(); e != null; e = e.next) {
                if (e.hash == hash && Objects.equals(e.key, key)) {
                    e.value = value;
                    return;
                }
            }
            addEntry(hash, key, value, index);
        } else {
            createEntry(hash, key, value, index);
        }
    }

    @Override
    public Long getKey(final String value) {
        for (final FileBucket bucket : table) {
            for (Entry e = bucket.getEntry(); e != null; e = e.next) {
                if (Objects.equals(e.value, value))
                    return e.key;
            }
        }
        return null;
    }

    @Override
    public String getValue(final Long key) {
        final Entry e = getEntry(key);
        return e == null ? null : e.value;
    }
}

Java Core, 5 уровень, 12 лекция, Задача: Факториал

День добрый господа.

Описание задачи:
Написать метод, который вычисляет факториал — произведение всех чисел от 1 до введенного числа включая его.
Пример: 4! = factorial(4) = 1*2*3*4 = 24
1. Ввести с консоли число меньше либо равно 150.
2. Реализовать функцию factorial.
3. Если введенное число меньше 0, то вывести 0.
0! = 1

Собственно мой код:

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            int input = Integer.parseInt(reader.readLine());
            reader.close();
            if (input <= 150)
                System.out.println(factorial(input));
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static String factorial(int n) {
        if (n == 0) return "1";
        else if (n < 0) return "0";

        return "" + (n * Integer.parseInt(factorial(n - 1)));
    }
}


Результаты выполнения:
-413
0

0
1

4
24

При отправке задания, прилетают ошибки валидации:
1. Программа должна выводить на экран факториал введенного числа.
2. Метод factorial должен возвращать строковое представление факториала числа переданного ему в качестве параметра.

Ну и мой вопрос — WTF?

UPD 26.04.2017: Вопрос снят. При вводе 150 на выходе имеем 0.

com.javarush.task.task18.task1827 один пункт не проходит проверку


public class Solution {
    private static  int idMax = 0;
    public static void main(String[] args) throws Exception {

            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String strfile = reader.readLine();
            reader.close();

            List<String> list = new ArrayList<>();

            BufferedReader fileread = new BufferedReader(new FileReader(strfile));
            String fileStr;
            while ((fileStr=fileread.readLine()) != null) {
                list.add(fileStr);
                int id = Integer.parseInt(fileStr.substring(0, 8).trim());
                if (id > idMax) idMax = id;
            }
            fileread.close();

            list.add(StrokaZapisi(args));

            BufferedWriter filewrite = new BufferedWriter(new FileWriter(strfile));
            for (int i=0; i< list.size(); i++) {
                if (i==list.size()-1) filewrite.write(list.get(i));
                else filewrite.write(list.get(i)+"\n");
            }
            filewrite.close();
    }

    static String Space(String stroka, int dlina){

        String space ="";
        int countSpace = dlina - stroka.length();
        for (int i=0; i< countSpace; i++) {
            space = space+" ";
        }
        return stroka = stroka+space;
    }
// формирование строки для записи в файл из аргументов командной строки
    static String StrokaZapisi (String[] args) {
        
        String name="";
        for(int i=1; i < args.length-2;i++) name=name+args[i]+" ";
        name = name.trim();
        if (name.length() > 30) name = name.substring(0, 30); else name = Space(name, 30);

        String price = args[args.length-1].trim();
        if (price.length() > 8) price = price.substring(0, 8); else price = Space(price, 8);

        String quantity = args[args.length-2].trim();
        if (quantity.length() > 4) quantity = quantity.substring(0, 4); else quantity = Space(quantity, 4);

        idMax++;
        String idMaxStr = String.valueOf(idMax);
        if (idMaxStr.length()>8) idMaxStr = idMaxStr.substring(0,8); else idMaxStr = Space(idMaxStr,8);
        String zapis = idMaxStr + name + price + quantity;

        return zapis;

    }
}

Подскажите в чём дело, целый день убит на решение этой задачи, 100500 раз всё переписано и подогнано под требования. Не проходит хоть тресни пункт «Форматирование новой строки товара должно четко совпадать с указанным в задании.» Чего не так не пойму.
Вывод в файле:

19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
123456 Куртка для сноубордистов, разм10173.991234
198479**Майка ростовка 170************12******2.1*
Вставляется последняя строчка, для удобства просмотра вместо пробелов "*". А так пробелу как по заданию.

task21.task2101 обсуждение кода

Уважаемые Java-кодеры!
Несколько дней тому назад, я вложил топик к данной задаче, в надежде получить от Вас
несколько дельных советов по ее решению.
Ваша вежливость не имеет границ, и я понял, что до этого уровня дошли единицы и то которые 
кодят по наитию. Про "сеньоров" с сайта вообще молчу.
Поэтому выкладываю код, прошедший валидацию.
Прошу дать комментарии по поводу его улучшения.
PS. Часть кода удалена, для соблюдения условий сайта. 

package com.javarush.task.task21.task2101;

/* 
Определяем адрес сети
*/
public class Solution {
    public static void main(String[] args) {
        byte[] ip = new byte[]{(byte) 192, (byte) 168, 1, 2};
        byte[] mask = new byte[]{(byte) 255, (byte) 255, (byte) 254, 0};
        byte[] netAddress = getNetAddress(ip, mask);
        print(ip);          //11000000 10101000 00000001 00000010
        print(mask);        //11111111 11111111 11111110 00000000
        print(netAddress);  //11000000 10101000 00000000 00000000

    }

    public static byte[] getNetAddress(byte[] ip, byte[] mask)
    {

        byte[] bytes =new byte[]{(byte) (ip[0]& mask[0]),(byte) (ip[1]& mask[1]),(byte) (ip[2]& mask[2]),(byte) (ip[3]& mask[3])};


        return bytes;
    }

    public static void print(byte[] bytes) {
        String stroka ="";

        for (int i = 0; i < bytes.length;i++)//  извлекаем данные из массива
        {
                String PaketString = Integer.toBinaryString((bytes[i])); // переводим  в бинарное отображение
                                                                            // 2 >>> 10
                                                                            // -64 >>> 11111111111111111111111111111000000
             int rang = 8 - PaketString.length(); // определяем разрядность массива

                if (rang > 0)// условие необходимости дополнить строку до 8 разрядов  прим 10 >>>> 00000010
                {

                    String razrmer = "0";
                    String razrmerPaket = "";


                        for (int j = 0; j < rang; j++)// цикл дополнения разряда "0"
                        {
                            razrmerPaket = razrmerPaket + razrmer;// формирование пустых разрядов
                        }

                    PaketString = razrmerPaket+PaketString;// создание пакета строки в правилином формате

                }
                    if (rang < 0)// проверка на условие лишних разрядов в строке прим 100000010 >>> 00000010
                    {
                      PaketString = PaketString.substring(PaketString.length()-8,PaketString.length()); // удаление значений лишних разрядов

                    }

                    stroka =stroka+" "+ PaketString;// правильной маски формата адресов

        }
       ***********************************// удаление лишнего пробела в 0 разряде строки
        System.out.println(********);

    }
}
  • ,

com.javarush.task.task18.task1825 Работает, не проходит тестирование

Код рабочий, проверял. Пишет, что у меня не выполнено ни одно условие кроме 1-го

package com.javarush.task.task18.task1825;

/* 
Собираем файл
Собираем файл из кусочков.
Считывать с консоли имена файлов.
Каждый файл имеет имя: [someName].partN.
Например, Lion.avi.part1, Lion.avi.part2, …, Lion.avi.part37.
Имена файлов подаются в произвольном порядке. Ввод заканчивается словом «end«.
В папке, где находятся все прочтенные файлы, создать файл без суффикса [.partN].
Например, Lion.avi.
В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, …, в конце — последнюю.
Закрыть потоки.
Требования:
1. Программа должна считывать имена файлов с консоли, пока не будет введено слово "end".
2. Создай поток для записи в файл без суффикса [.partN] в папке, где находятся все считанные файлы.
3. В новый файл перепиши все байты из файлов-частей *.partN.
4. Чтение и запись должны происходить с использованием буфера.
5. Созданные для файлов потоки должны быть закрыты.
*/
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<File> list = new ArrayList<>();
        while (true) {
            String name = reader.readLine();
            if (!name.equals("end"))
            list.add(new File(name));
            else break;
        }
/*Названия одинаковые, соответственно сортировка листа работает корректно от part1 до partN */
        Collections.sort(list);
        //файл создается в папке с предыдущими файлами
        String resultFile = list.get(0).getAbsolutePath().split(".part")[0] + "";
        File destFile = new File(resultFile);
        destFile.createNewFile();
        FileOutputStream outStream = new FileOutputStream(destFile);
//записывает все буфером
        for (File search : list) {
            FileInputStream inStream = new FileInputStream(search);
            byte[] buffer = new byte[inStream.available()];
            while (inStream.available() > 0) {
                int count = inStream.read(buffer);
                outStream.write(buffer,0,count);
            }
            inStream.close();
        }
        outStream.close();
        reader.close();
    }
}


Ввод:

*C:My programsCodingJavaRushTasks2.JavaCoresrccomjavarushtasktask18task1825avi.part3

C:My programsCodingJavaRushTasks2.JavaCoresrccomjavarushtasktask18task1825avi.part1

C:My programsCodingJavaRushTasks2.JavaCoresrccomjavarushtasktask18task1825avi.part2

end*

Вывод: (создается файл «avi» который содержит инфу 1,2,3 файлов в этой последовательности) «OneTwoThree»
  • ,

task30.task3008 Чат(19)

не могу понять, в чем проблема, все работает как надо, но валидатор не принимает условие «Метод processIncomingMessage должен выводить на экран полученное сообщение message.»

public class BotClient extends Client {

public static void main(String[] args){
BotClient botClient = new BotClient();
botClient.run();
}
@Override
protected String getUserName() {

String botName = «date_bot_» + ((int)(Math.random()*100));
return botName;
}

@Override
protected boolean shouldSendTextFromConsole() {
return false;
}

@Override
protected SocketThread getSocketThread() {
return new BotSocketThread();
}

public class BotSocketThread extends Client.SocketThread{
@Override
protected void clientMainLoop() throws IOException, ClassNotFoundException {
sendTextMessage(«Привет чатику. Я бот. Понимаю команды: дата, день, месяц, год, время, час, минуты, секунды.»);
super.clientMainLoop();
}

@Override
protected void processIncomingMessage(String message) {

ConsoleHelper.writeMessage(message);

String[] messageSplit = message.split(": ");
String result = «Информация для » + messageSplit[0]+ ": ";
Calendar cal = Calendar.getInstance();

switch (messageSplit[1].trim()){
case «дата»:
result += new SimpleDateFormat(«d.MM.YYYY»).format(cal.getTime());
sendTextMessage(result);
break;
case «день»:
result += new SimpleDateFormat(«d»).format(cal.getTime());
sendTextMessage(result);
break;
case «месяц»:
result += new SimpleDateFormat(«MMMM»).format(cal.getTime());
sendTextMessage(result);
break;
case «год»:
result += new SimpleDateFormat(«YYYY»).format(cal.getTime());
sendTextMessage(result);
break;
case «время»:
result += new SimpleDateFormat(«H:mm:ss»).format(cal.getTime());
sendTextMessage(result);
break;
case «час»:
result += new SimpleDateFormat(«H»).format(cal.getTime());
sendTextMessage(result);
break;
case «минуты»:
result += new SimpleDateFormat(«m»).format(cal.getTime());
sendTextMessage(result);
break;
case «секунды»:
result += new SimpleDateFormat(«s»).format(cal.getTime());
sendTextMessage(result);
break;
}

}
}
}

task21.task2101

Помогите разобрать задачу
Задача решается с массивом int тривиально просто, однако создатели усложняют задачу приводя
значения типов int  к значениям типов byte, который в свою очередь имеет значения от -127 до +128
и в связи с этим уходят в отрицательный диапазон.
Можно конечно городить забор из приведения к типам, но валидатор точно это не оценит.
Что делать??
/* 
Определяем адрес сети
*/
public class Solution {
    public static void main(String[] args) {
        byte[] ip = new byte[]{(byte) 192, (byte) 168, 1, 2};
        byte[] mask = new byte[]{(byte) 255, (byte) 255, (byte) 254, 0};
        byte[] netAddress = getNetAddress(ip, mask);
        print(ip);          //11000000 10101000 00000001 00000010
        print(mask);        //11111111 11111111 11111110 00000000
        print(netAddress);  //11000000 10101000 00000000 00000000
    }

    public static byte[] getNetAddress(byte[] ip, byte[] mask) {
        return new byte[4];
    }

    public static void print(byte[] bytes) {
    }
}
  • ,

task36.task3607

Описание класса:
1. Реализует интерфейс Queue.
2. Используется при работе с трэдами.
3. Из этой очереди элементы могут быть взяты только тогда, когда они заэкспарятся, их время задержки истекло.
4. Головой очереди является элемент, который заэкспарился раньше всех.

Мой код — возвращает верное значение в ИДЕЕ, но валидатору что-то не нравится.
Попробовал запустить задачу в браузере — на выходе null.
Возник по ходу вопрос, а как java.util.* работает в браузере, если его нету в classpath?
Буду благодарен за любую подсказку:

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/*
Найти класс по описанию
*/
public class Solution {
    public static void main(final String[] args) {
        System.out.println(getExpectedClass());
    }
    public static Class getExpectedClass() {
        final Set<String> classNames = new HashSet<>();
        final URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        final URL[] jarsPath = classLoader.getURLs();
        //find classes within rt.jar package
        for (final URL jarPath : jarsPath) {
            if (jarPath.toString().endsWith("rt.jar")) {
                try {
                    final JarFile jarFile = new JarFile(jarPath.getPath().toString());
                    final Enumeration<JarEntry> en = jarFile.entries();
                    while (en.hasMoreElements()) {
                        final String fileName = en.nextElement().getName();
                        if (fileName.startsWith("java/util") && fileName.endsWith(".class")) {
                            classNames.add(fileName);
                        }
                    }
                } catch (final IOException ignored) {
                }
            }
        }
        //find class with Queue interface implementation
        for (final String className : classNames) {
            try {
                final String fileName = className.substring(0, className.length() - 6).replace('/', '.');
                final Class cls = Class.forName(fileName);
                if (Queue.class.isAssignableFrom(cls) && cls.getEnclosingClass() == null) {
                    final Field[] fields = cls.getDeclaredFields();
                    final Method[] methods = cls.getDeclaredMethods();
                    if (Arrays.stream(methods)
                            .filter(m -> m.getName().contains("peekExpired"))
                            .flatMap(m -> Arrays.stream(fields))
                            .anyMatch(f -> f.getType().equals(Thread.class))) {
                        return cls;
                    }
                }
            } catch (final ClassNotFoundException ignored) {
            }
        }
        return null;
    }
}
  • ,

package com.javarush.task.task20.task2002; подскажите что не так друзья!

package com.javarush.task.task20.task2002;

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

/* 
Читаем и пишем в файл: JavaRush

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


Требования:
1. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список users пустой.
2. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список users не пустой.
3. Класс Solution.JavaRush не должен поддерживать интерфейс Serializable.
4. Класс Solution.JavaRush должен быть публичным.
5. Класс Solution.JavaRush не должен поддерживать интерфейс Externalizable.
*/
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 = new File("c:\\0\\4.txt");
            OutputStream outputStream = new FileOutputStream(your_file_name);
            InputStream inputStream = new FileInputStream(your_file_name);

            JavaRush javaRush = new JavaRush();

            //формат даты SimpleDateFormat
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

            User ivan = new User();
            ivan.setFirstName("Иванов");
            ivan.setLastName("Иван");
            Date Bdate = new Date();
            Bdate = dateFormat.parse("01/05/1992");

            ivan.setBirthDate(Bdate);
            ivan.setMale(true);
            ivan.setCountry(User.Country.RUSSIA);

            User vasya = new User();
            vasya.setFirstName("Васильев");
            vasya.setLastName("Василий");
            Date bDate = new Date();
            bDate = dateFormat.parse("05/06/1976");
            vasya.setBirthDate(bDate);
            vasya.setMale(true);
            vasya.setCountry(User.Country.UKRAINE);

            javaRush.users.add(ivan);
            javaRush.users.add(vasya);



            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            javaRush.save(outputStream);

            outputStream.flush();

            JavaRush loadedObject = new JavaRush();
            loadedObject.load(inputStream);
            //check here that javaRush object equals to loadedObject object - проверьте тут, что javaRush и loadedObject равны
            if(javaRush.equals(loadedObject)){
                System.out.println("Загрузка прошла удачно");
            }else{
                System.out.println("Загрузка неудачна");
            }
            outputStream.close();
            inputStream.close();

/*
 //тестовая печать

            for(User u:javaRush.users){
                System.out.println(u.toString());
                System.out.println(u.getFirstName());
                System.out.println(u.getLastName());
                System.out.println(u.getBirthDate());
                System.out.println(u.isMale());
                System.out.println(u.getCountry());


                System.out.println("________________________");
            }

*/
        } 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<>();

        public void save(OutputStream outputStream) throws Exception {
            //implement this method - реализуйте этот метод
            PrintWriter printWriter = new PrintWriter(outputStream);
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            printWriter.println("<newObject>");
            printWriter.println(users.size());
            if(users.size()>0){
                for(User u:users){
                    //printWriter.println(u);
                    printWriter.println(u.getFirstName());
                    printWriter.println(u.getLastName());
                    String sd = dateFormat.format(u.getBirthDate());

                    printWriter.println(sd);
                    printWriter.println(u.isMale());
                    printWriter.println(u.getCountry());
                }
            }

            printWriter.flush();
            printWriter.close();
        }

        public void load(InputStream inputStream) throws Exception {
            //implement this method - реализуйте этот метод
            BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            String line;
            while ((line=fileReader.readLine())!=null) {
                if (line.equals("<newObject>")) {


                    int size = Integer.parseInt(fileReader.readLine());
                    for (int i = 0; i < size; i++) {
                        User user = new User();
                        user.setFirstName(fileReader.readLine());
                        user.setLastName(fileReader.readLine());
                        Date bd = new Date();
                        bd = dateFormat.parse(fileReader.readLine());
                        user.setBirthDate(bd);
                        user.setMale(Boolean.parseBoolean(fileReader.readLine()));
                        user.setCountry(User.Country.valueOf(fileReader.readLine()));

                        users.add(user);
                    }
                }


            }






            fileReader.close();
        }

        @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;
        }
    }
}
  • ,

com.javarush.task.task05.task0525;

package com.javarush.task.task05.task0525;

/*
И целой утки мало
*/

public class Solution {

public static void main(String[] args) {
Duck duck1 = new Duck();
Duck duck2 = new Duck();
System.out.println(duck1);
System.out.println(duck2);
//напишите тут ваш код
}

public static class Duck {
public String toString() {
return «Duck»;
}
}

Где берется toSring()?
Почему другое имя метода не подходит?
Почему это именно так работает?
Если он где-то прописан, в библиотеке, где import?
Если он где-то прописан, почему вдруг у меня появляется возможность называть им свой метод?

task.task18.task1828 совет по решению

Коллеги, посмотрите код, уже сам не могу вменяемо оценить, где ошибаюсь?
Решал через LinkedHashMap. Идея простая. Выделил ID из строки, и занес в мапу
(ID, полный String);
После по ключу ищу что сделать,
если удалять, то по ID,
если заменить, то клею строку из данных, потом в мапу заношу.
После все заливаю write. Но явно где то что то не так по реализации.

Прайсы 2
CrUD для таблицы внутри файла
Считать с консоли имя файла для операций CrUD
Программа запускается с одним из следующих наборов параметров:
-u id productName price quantity
-d id

Значения параметров:
где id — 8 символов
productName — название товара, 30 chars (60 bytes)
price — цена, 8 символов
quantity — количество, 4 символа
-u — обновляет данные товара с заданным id
-d — производит физическое удаление товара с заданным id (все данные, которые относятся к переданному id)

В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity
Данные дополнены пробелами до их длины

Пример:
19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
19847983Куртка для сноубордистов, разм10173.991234

Требования:
1. Программа должна считать имя файла для операций CrUD с консоли.
2. При запуске программы без параметров список товаров должен остаться неизменным.
3. При запуске программы с параметрами "-u id productName price quantity" должна обновится информация о товаре в файле.
4. При запуске программы с параметрами "-d id" строка товара с заданным id должна быть удалена из файла.
5. Созданные для файлов потоки должны быть закрыты.

package com.javarush.task.task18.task1828;

/*
Прайсы 2
*/

import java.io.*;
import java.util.*;

public class Solution {
    public static void main(String[] args) throws Exception {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        reader.close();
        Map<Integer, String> map = new LinkedHashMap<>();
        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "Cp1251"));
        while (in.ready()) {
            String str1 = in.readLine();
            int id1 = Integer.parseInt(str1.substring(0, 8).replaceAll("\\D", ""));
            map.put(id1, str1);
        }
        if (args[0].equals("-u")) {
            String productname = args[2];
            for (int l = 3; l < args.length - 2; l++) productname += " " + args[l];
            String str3 = String.format("%-8.8s%-30.30s%-8.8s%-4.4s%n", String.valueOf(args[1]), productname, args[args.length - 2], args[args.length - 1]);
            map.put(Integer.parseInt(args[1]), str3);
        }
        if (args[0].equals("-d")) {
            map.remove(Integer.parseInt(args[1]));
        }

        in.close();
        BufferedWriter fileWR = new BufferedWriter(new FileWriter(fileName));
        for(Map.Entry<Integer, String> entry: map.entrySet()){
            String str4 = entry.getValue();
            fileWR.write(str4);
        }
        fileWR.close();
    }

task13.task1326

package com.javarush.task.task13.task1326;

/* 
Сортировка четных чисел из файла
*/


import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(new FileInputStream("c:/gek/1.txt"));
        ArrayList<Integer> list = new ArrayList<>();
        while (scanner.hasNext()) {
            int num = scanner.nextInt();
            if (num%2==0)
                list.add(num);
        }
        scanner.close();
        Collections.sort(list);
        for (Integer arr : list) {
            System.out.println(arr);
        }
    }
}


Что не так?
В файле это:
12
11
1374
156
112
354
9484
3112
1314
6565
64654654
641321324
64

Программа выдает:
12
64
112
156
354
1314
1374
3112
9484
64654654
641321324

Несколько раз по разному переписывал код и не принимает.