Обсуждение задач level18.lesson03.task03 и level18.lesson03.task04

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

Итак условие задачи:
/* Самые частые/редкие байты
Ввести с консоли имя файла
Найти байты, которые встречаются в файле меньше всего раз.
Вывести их на экран через пробел
Закрыть поток ввода-вывода
*/

Топик создается для того чтобы найти правильное решение. Вариантов есть несколько.

В задаче на алфавит все наверное использовали HashMap. Казалось бы можно было скопировать код, поменять источник с консоли на файл, и все. Но здесь можно обойтись массивом, где индексом будет значение байта, а значением элемента — количество.

    int[] howManyTimesIsByteInFile = new int[256];


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

    LinkedList<Integer> bytes = new LinkedList<Integer>();
    int maxCount = 0;
        for (int i = 0; i < howManyTimesByteIsInFile.length ; i++)
        {
            if(howManyTimesISByteInFile[i] >= maxCount){
               int n = howManyTimesISByteInFile[i];
                if(n == maxCount){
                       bytes.add(i);
                }
                if(n > maxCount){
                    maxCount = n;
                    bytes.clear();
                    bytes.add(i);
                }   
            }
        }


Очищаем список, чтобы не было элементов, которые встречаются меньше, чем самый частый. Но такой вариант мне не нравится, две проверки, и постоянное очищение списка. Я выбрал решение в два прохада.


        int minCount = 0;
        for (int i = 0; i < howManyTimesByteIsInFile.length ; i++)
        {
            if(howManyTimesByteIsInFile[i] < minCount){
                minCount = howManyTimesByteIsInFile[i];
            }
        }

        LinkedList<Integer> bytes = new LinkedList<Integer>();

        for (int i = 0; i < howManyTimesIsByteInFile.length; i++)
        {
            if(howManyTimesByteIsInFile[i] <= minCount ){
               bytes.add(i);
            }
        }

Сначала ищем максимум/минимум. А вторым проходом находим кто нам подходит. В 8й джаве можно решать задачу даже без циклов, там есть Stream API, на сколько я знаю. Так вот какое решение наиболее оптимально: HashMap vs Array, и один проход vs два прохода?
Вычислительная сложность в обоих случаях O(n), в двух проходах какбы 2n, но 2 это константа, которую можем отбросить. В то же время в одном проходе больше операций с очищением списка.

level17.lesson10.home09 не принимает на сервере=(

public class Solution {
    public static List<String> allLines = new ArrayList<String>();
    public static List<String> forRemoveLines = new ArrayList<String>();

    public static void main(String[] args)  {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        try
        {


            String firstFileName = reader.readLine();
            String secondFileName = reader.readLine();
            reader.close();

            BufferedReader firstFilereader = new BufferedReader(new FileReader(firstFileName));
            BufferedReader secondFilereader = new BufferedReader(new FileReader(secondFileName));

            String firstFileline;
            String secondFileline;

            while ((firstFileline = firstFilereader.readLine()) != null)
            {
                allLines.add(firstFileline);
            }
            firstFilereader.close();

            while ((secondFileline = firstFilereader.readLine()) != null)
            {
                forRemoveLines.add(secondFileline);
            }
            secondFilereader.close();

            Solution solution = new Solution();
            solution.joinData();
        }
        catch (Exception e){

        }
    }

    public void joinData () throws CorruptedDataException {

        if(allLines.containsAll(forRemoveLines)){
            allLines.removeAll(forRemoveLines);
        }
        else {
            allLines.clear();
            throw new CorruptedDataException();
        }

    }
}


Что я сделал не так?(

Сброс прогресса

Очень надо иметь возможность сбросить все и начать заново (как минимум уровня с 15-го). Что бы вдумчиво решить задачи еще раз. Восстановить знания.
  • ,

JUnit для JavaRush или немного о тестировании в домашних условиях.

Надоело десятки раз вбивать в консоль тестовые данные чтобы проверить свою задачу? Добро пожаловать под кат, я расскажу что можно с этим сделать.
  • ,

Начинающему JavaRush'евцу.

Если Вы поставили себе цель стать крутым Java-кодером и только начинаете свой путь с JavaRush, если Ваша цель получить максимум пользы от данного ресурса, а не бесполезное прожигание времени путем бездумного «отстреливания» задачек — этот топик для Вас.
  • ,

Где взять плагин для Intellij IDEA чтобы решать задачи?

Доброго всем времени суток! Столкнулся с проблемой. Думал, что можно пройти курс решая задачи только в браузере. Но похоже это не так. Решил поставить Intellij IDEA. Нашел видео инструкцию по установке. Но не нашел где взять плагин для того, чтоб можно было решать задачи и как настроить Intellij IDEA. Помню где-то видел, но сейчас не могу найти. Помогите, плиз, кто может!
Заранее благодарю!
  • ,

level33.lesson05.home03

Условие
/* Десериализация JSON объекта
НЕОБХОДИМО: подключенные библиотеки Jackson Core, Bind и Annotation версии 2.4.3

В метод convertFromJsonToNormal первым параметром приходит имя файла, который содержит один ДЖЕЙСОН объект.
Вторым параметром приходит имя класса, объект которого находится в файле.
Метод convertFromJsonToNormal должен вычитать объект из файла, преобразовать его из JSON и вернуть его.
*/

Код
public static <T> T convertFromJsonToNormal(String fileName, Class<T> clazz) throws IOException {
        ObjectMapper objectMapper= new ObjectMapper();
        T result = objectMapper.readValue(new File(fileName), clazz);
        return result;
    }


Тест

public static void main(String[] args) throws IOException
    {
        Cat cat = convertFromJsonToNormal("C:\\JR\\resultFile.txt", Cat.class);
        System.out.println(cat);
    }

    @JsonAutoDetect
    public static class Cat{
        public String name;
        public int age;

        Cat(){}

        @Override
        public String toString()
        {
            return "Cat{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }


Содержание файла
{«name»:«Murkfsdfa»,«age»:3}

Все корректно работает. Из файла все восстанавливает. В чем может быть проблема?

level05.lesson12.home02

Не проходит тестирование, не ясно почему

package com.javarush.test.level05.lesson12.home02;

/* Man and Woman
1. Внутри класса Solution создай public static классы Man и Woman.
2. У классов должны быть поля: name(String), age(int), address(String).
3. Создай конструкторы, в которые передаются все возможные параметры.
4. Создай по два объекта каждого класса со всеми данными используя конструктор.
5. Объекты выведи на экран в таком формате [name + " " + age + " " + address].
*/


public class Solution
{
    public static void main(String[] args)
    {
        Man man1 = new Man("Bob", 25, "Moscow");
        Man man2 = new Man("Ted", 38, "Japan");
        Woman woman1 = new Woman("Angel", 23, "Moon");
        Woman woman2 = new Woman("April", 34, "Sun");

        System.out.println(man1);
        System.out.println(man2);
        System.out.println(woman1);
        System.out.println(woman2);
    }

    public static class Man
    {
        private String name;
        private int age;
        private String addres;

        public Man(String name, int age, String addres) {
            this.name = name;
            this.age = age;
            this.addres = addres;
        }

        public String toString(){ return name+" "+age+" "+addres; }
    }

    public static class Woman
    {
        private String name;
        private int age;
        private String addres;

        public Woman(String name, int age, String addres) {
            this.name = name;
            this.age = age;
            this.addres = addres;
        }

        public String toString(){ return name+" "+age+" "+addres; }
    }
}

level18.lesson05.task03

Уже вторая задача на этом уровне непонятно во что упирается.
Смотрел обсуждения аналогичные, у некоторых достаточно сложные проверки, я старался максимально упростить и протестировал уже по разному, работает же.

Что от меня хотят не понимаю )

package com.javarush.test.level18.lesson05.task03;

/* Разделение файла
Считать с консоли три имени файла: файл1, файл2, файл3.
Разделить файл1 по следующему критерию:
Первую половину байт записать в файл2, вторую половину байт записать в файл3.
Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть.
Закрыть потоки ввода-вывода
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        byte[] buff;

        FileInputStream file1 = new FileInputStream(reader.readLine());
        FileOutputStream file2 = new FileOutputStream(reader.readLine());
        FileOutputStream file3 = new FileOutputStream(reader.readLine());
        reader.close();


        int file1Size = file1.available();
        buff = new byte[file1Size/2 + file1Size%2];


        file2.write(buff, 0, file1.read(buff));
        file3.write(buff, 0, file1.read(buff));


        file1.close();
        file2.close();
        file3.close();

    }
}


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

Вопрос о задаче level05.lesson12.bonus03

Прошу помощи в решении задачи, программа работает, но проверку не проходит.

import java.io.BufferedReader;
import java.io.InputStreamReader;

/* Задача по алгоритмам
Написать программу, которая:
1. вводит с консоли число N > 0
2. потом вводит N чисел с консоли
3. выводит на экран максимальное из введенных N чисел.
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(reader.readLine());

        int[] array = new int[n];

        for (int i = 0; i < n; i++) {
            array[i] = Integer.parseInt(reader.readLine());
        }

        int maximum = 0;

        for (int i = 0; i < n; i++) {
            if (array[i] > maximum) {
                maximum = array[i];
            }
        }

        System.out.println(maximum);
    }
}