• ,

javarush.task.task18.task1803 или одна из самых интересных задач

Вот и пришлось мне тут зарегистрироваться, ибо на днях столкнулся с одной из немногих задач, решение которой в голову не приходило вообще. Если честно, для меня это самая сложная задача, которую я встречал за весь курс, что даже аж тут зарегистрироваться пришлось, так как на 3-ий день уже нервы окончательно сдали. Пришлось тупо код скопипастить, но понять все-таки хочется. Это самый легкий код (по крайней мере по объему, в других примерах аж 6 листов люди создают). Вот, собственно, вопросы:

  1. Что значит добавление в map значения 1? (Первый while, условие else)
  2. Почему мы назначаем значение getValue() + 1?
  3. Во втором (отдельном от цикла while) for , мы приравниваем байт к нулю, да еще и очищаем отдельный(непонятно для чего созданный) массив. Зачем?
  4. Соответственно, если значение равно 0, мы добавляем ключ в массив
  5. Ну и последнее, что выводит массив? Количество повторений или сами байты?

Спасибо большое заранее.

    Ввести с консоли имя файла.
    Найти байт или байты с максимальным количеством повторов.
    Вывести их на экран через пробел.
    Закрыть поток ввода-вывода.


public class Solution
    {
        public static void main(String[] args) throws Exception
    {
       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       FileInputStream inputStream = new FileInputStream(reader.readLine());
    
    
        HashMap<Integer, Integer> map = new HashMap<>();
    
        while (inputStream.available() > 0)
        {
            int data  = inputStream.read();
    
            if (map.containsKey(data))
            {
                for (HashMap.Entry<Integer, Integer> me : map.entrySet())
                {
                    if (me.getKey().equals(data))
                    {
                        me.setValue(me.getValue() + 1);
                    }
                }
            }
            else {
                map.put(data,1);
            }
        }
    
        int count=0;
        ArrayList<Integer> list = new ArrayList<>();
    
    
        for (HashMap.Entry<Integer, Integer> me : map.entrySet())
        {
            if(count<me.getValue())
            {
                count=me.getValue();
                list.clear();
                list.add(me.getKey());
            }
            else if(count==me.getValue())
            {
                list.add(me.getKey());
            }
        }
        for (Integer aList : list)
        {
            System.out.print(aList + " ");
        }
        inputStream.close();
    }
    }

level15.lesson12.home09

package com.javarush.test.level15.lesson12.home09;

/* Парсер реквестов
Считать с консоли URl ссылку.
Вывести на экран через пробел список всех параметров (Параметры идут после ? и разделяются &, например, lvl=15).
URL содержит минимум 1 параметр.
Если присутствует параметр obj, то передать его значение в нужный метод alert.
alert(double value) - для чисел (дробные числа разделяются точкой)
alert(String value) - для строк

Пример 1
Ввод:
http://javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Вывод:
lvl view name

Пример 2
Ввод:
http://javarush.ru/alpha/index.html?obj=3.14&name=Amigo
Вывод:
obj name
double 3.14
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static void main(String[] args) throws IOException {
        //add your code here
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String s = reader.readLine();
        String URL[] = s.split("\\?");
        String Parametrs[] = URL[1].split("&");
        int d = Parametrs.length;

        HashMap<String, String> map = new HashMap<String, String>();
        for (int i = 0; i < d; i++)
        {
            if (Parametrs[i].contains("="))
            {
                String mass[] = Parametrs[i].split("=");
                map.put(mass[0], mass[1]);
            }
            else map.put(Parametrs[i], "");
        }

        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            System.out.print(key + " ");
        }
        System.out.println();
        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            String value = entry.getValue();
            if (key.equals("obj")) {
                try
                {
                    double a = Double.parseDouble(value);
                    alert(a);
                } catch (Exception e) {
                    alert(value);
                }
            }
        }
    }

    public static void alert(double value) {
        System.out.println("double " + value);
    }

    public static void alert(String value) {
        System.out.println("String " + value);
    }
}


Тестовая строка: javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Выводит: view lvl name
Т.е. почему-то сначала выводит параметры без значения, а потом со значением. Хотя забиваем значения в HashMap по очереди. Не могу раскрыть данную загадку. Помогите разобраться, пожалуйста!

level15.lesson12.home09

package com.javarush.test.level15.lesson12.home09;

/* Парсер реквестов
Считать с консоли URl ссылку.
Вывести на экран через пробел список всех параметров (Параметры идут после ? и разделяются &, например, lvl=15).
URL содержит минимум 1 параметр.
Если присутствует параметр obj, то передать его значение в нужный метод alert.
alert(double value) - для чисел (дробные числа разделяются точкой)
alert(String value) - для строк

Пример 1
Ввод:
http://javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Вывод:
lvl view name

Пример 2
Ввод:
http://javarush.ru/alpha/index.html?obj=3.14&name=Amigo
Вывод:
obj name
double 3.14
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static void main(String[] args) throws IOException {
        //add your code here
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String s = reader.readLine();
        String URL[] = s.split("\\?");
        String Parametrs[] = URL[1].split("&");
        int d = Parametrs.length;

        HashMap<String, String> map = new HashMap<String, String>();
        for (int i = 0; i < d; i++)
        {
            if (Parametrs[i].contains("="))
            {
                String mass[] = Parametrs[i].split("=");
                map.put(mass[0], mass[1]);
            }
            else map.put(Parametrs[i], "");
        }

        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            System.out.print(key + " ");
        }
        System.out.println();
        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            String value = entry.getValue();
            if (key.equals("obj")) {
                try
                {
                    double a = Double.parseDouble(value);
                    alert(a);
                } catch (Exception e) {
                    alert(value);
                }
            }
        }
    }

    public static void alert(double value) {
        System.out.println("double " + value);
    }

    public static void alert(String value) {
        System.out.println("String " + value);
    }
}


Тестовая строка: javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Выводит: view lvl name
Т.е. почему-то сначала выводит параметры без значения, а потом со значением. Хотя забиваем значения в HashMap по очереди. Не могу раскрыть данную загадку. Помогите разобраться, пожалуйста!
  • ,

level08.lesson08.task03;

Одинаковые имя и фамилия
1. Создать словарь (Map<String, String>)
2. занести в него десять записей по принципу «Фамилия» — «Имя».
3. Проверить сколько людей имеют совпадающие с заданным имя или фамилию.


всё есть, все выполняется, но на сервере не принимается что с main что с выводом информации что без этого.
где подвох?

package com.javarush.test.level08.lesson08.task03;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/* Одинаковые имя и фамилия
Создать словарь (Map<String, String>)
занести в него десять записей по принципу «Фамилия» - «Имя».
Проверить сколько людей имеют совпадающие с заданным имя или фамилию.
*/

public class Solution
{
    public static void main(String args[])
    {
        HashMap<String,String> hm = createMap();

        int fn_count = getCountTheSameFirstName(hm,"Алексей");
        int ln_count = getCountTheSameLastName(hm,"Аксенов");

        //System.out.println("name: "+fn_count+"\nsurname: "+ln_count);
    }

    public static HashMap<String, String> createMap()
    {
        //напишите тут ваш код
        HashMap<String,String> hm = new HashMap<>();
        hm.put("Алексей","Аксенов");
        hm.put("Андрей","Аксенов");
        hm.put("Сергей","Виноградов");
        hm.put("Кирилл","Гуляев");
        hm.put("Данил","Денисов");
        hm.put("Людвиг","Елисеев");
        hm.put("Герасим","Журавлев");
        hm.put("Иван","Зайцев");
        hm.put("Илья","Исаев");
        hm.put("Захар","Киселев");

        return hm;
    }

    public static int getCountTheSameFirstName(HashMap<String, String> map, String name)
    {
        //напишите тут ваш код
        int counter = 0;
        Iterator<Map.Entry<String,String>> iterator = map.entrySet().iterator();

        while (iterator.hasNext())
        {
            Map.Entry<String,String> pair = iterator.next();
            String key = pair.getKey();
            //String value = pair.getValue();
            if (key.equals(name)) counter++;
        }

        return counter;
    }

    public static int getCountTheSameLastName(HashMap<String, String> map, String lastName)
    {
        //напишите тут ваш код
        int counter = 0;
        Iterator<Map.Entry<String,String>> iterator = map.entrySet().iterator();

        while (iterator.hasNext())
        {
            Map.Entry<String,String> pair = iterator.next();
            //String key = pair.getKey();
            String value = pair.getValue();
            if (value.equals(lastName)) counter++;
        }
        return counter;
    }
}
  • ,

Задача - Плагин выдает неизвестную ошибку при проверке .... что не так ?






package com.javarush.test.level08.lesson08.task05;

import java.util.*;

/* Удалить людей, имеющих одинаковые имена
Создать словарь (Map<String, String>) занести в него десять записей по принципу «фамилия» - «имя».
Удалить людей, имеющих одинаковые имена.
*/

public class Solution
{

    public static void main (String[] args) {
        HashMap<String, String> map = createMap();
                // key   // value
        map.put("Schwarz","Arnold");
        map.put("Dark","Arnold");
        map.put("Tom","Jones");
        map.put("Sly","Jones");
        map.put("Jhon","Jones");
        map.put("kosta","Tomson");
        map.put("Yan","Lipavsky");

        // before
        System.out.println("before " + map.entrySet());

        removeTheFirstNameDuplicates(map);

        // after
        System.out.println("after " + map.entrySet());
    }

    public static HashMap<String, String> createMap()
    {
        HashMap<String , String> myMap = new HashMap<String,String>();
        return myMap;
    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {

        Set<String> names = new HashSet<>(); // list of names
        Set<String> duplicates = new HashSet<>(); // list of duplicate names


        for (Map.Entry<String, String> entry : map.entrySet())
        {
            String v = entry.getValue();

                if (names.contains(v)) {
                    duplicates.add(v);
                } else {
                     names.add(v);
                }
        }

        System.out.println("names:" + names);
        System.out.println("duplicates:" + duplicates);

        for (String s : duplicates) {
            removeItemFromMapByValue(map, s);
        }

    }

    public static void removeItemFromMapByValue(HashMap<String, String> map, String value)
    {
        HashMap<String, String> copy = new HashMap<String, String>(map);
        for (Map.Entry<String, String> pair: copy.entrySet())
        {
            if (pair.getValue().equals(value))
                map.remove(pair.getKey());
        }
    }
}







  • ,

Объекты классов и коллекции. Непонятки.

Во время обучения Java возникает куча вопросов, некоторые решаются, а некоторые так и остаются не решенными. Вот и у меня возникла пара вопросов.

1. Вопрос по объектам класса и их объявлению.

Чем такая запись
Cat cat = new Cat();

отличается от такой?
new Cat();


Правильно ли я понимаю, что если я напишу так:
Cat Murka = new Cat();

то это будет равносильно следующей записи:
new Cat(Murka);


А если я напишу вот так?
Cat Murka = new Cat(Barsik);

Что произойдет в этом случае? Я сделаю копию объекта Barsik и запишу его в объект Murka? Верно?

2. Вопрос по Коллекциям

Какая разница между записями? В чем принципиальное отличие?

Map<String,String> map1 = new HashMap<->();


HashMap<String,String> map2 = new HashMap<->();

Как использовать рекурсию для создания "Mind Map" и вывода содержимого. Мой успешный опыт.

Приветствую!


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

Введение

Недавно я захотел создать для себя эдакий инструмент, который помогал бы мне (и вдруг еще кому-то)
  • ,

level18.lesson03.task03 работает, но не компилируется на сервере

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

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

/* Самые частые байты
Ввести с консоли имя файла
Найти байт или байты с максимальным количеством повторов
Вывести их на экран через пробел
Закрыть поток ввода-вывода
*/

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        FileInputStream fileInputStream = new FileInputStream(fileName);
        ArrayList<Integer> list = new ArrayList<>();
        while(fileInputStream.available()>0){
            list.add(fileInputStream.read());
        }
        HashMap<Integer, Integer> hm = new HashMap<>();
        Integer am;
        for (Integer i : list) {

            am = hm.get(i);
            hm.put(i, am == null ? 1 : am + 1);
        }
        Iterator<HashMap.Entry<Integer, Integer>> iterator = hm.entrySet().iterator();
        HashMap.Entry<Integer, Integer> tmp = iterator.next();
        int max = tmp.getValue();
        while(iterator.hasNext()){
            HashMap.Entry<Integer, Integer> pair = iterator.next();
            if(pair.getValue()>max){
                max = pair.getValue();
            }
        }
        for (HashMap.Entry<Integer, Integer> pair1 : hm.entrySet())
        {
            if(pair1.getValue()==max){
                System.out.print(pair1.getKey()+" ");
            }
        }
        reader.close();
        fileInputStream.close();
    }
}
  • ,

level08.lesson11.bonus02; Возможно не понял условие.

Так то все хорош работает, а не принимает. Тогда не понимаю, что хотят.Помогите, пожалуйста!
package com.javarush.test.level08.lesson11.bonus02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


/* Нужно добавить в программу новую функциональность
Задача: Программа определяет, какая семья (фамилию) живёт в доме с указанным номером.
Новая задача: Программа должна работать не с номерами домов, а с городами:
Пример ввода:
Москва
Ивановы
Киев
Петровы
Лондон
Абрамовичи

Лондон

Пример вывода:
Абрамовичи
*/

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Map<String,String> mapi = new HashMap<String,String>();
        String imStrComing=reader.readLine();
        String outNeed="";
        mapi.put("Москва","Ивановы");
        mapi.put("Киев","Петровы");
        mapi.put("Лондон","Абрамовичи");
        Iterator<Map.Entry<String,String>> iti = mapi.entrySet().iterator();
        while(iti.hasNext()){
            Map.Entry<String, String> pair = iti.next();
            if(pair.getKey().equals(imStrComing))
             outNeed=  mapi.get(imStrComing);
            if(pair.getValue().equals(imStrComing)){
                outNeed= pair.getKey();

            }
        }
        System.out.println(outNeed);
    }
}
  • ,

package com.javarush.test.level08.lesson08.task05;

   Доброго времени суток, джаварашевцы. Очень не хотелось создавать новый топик по такой изъезженной теме как коллекции, но вижу придется. Помогите пожалуйста разобраться и исправить код. Чувствую, что где-то конкретно затупил, но в упор не вижу. Уже второй день сижу на работе пялюсь и не могу понять, что не так. Ниже я буду выкладывать части кода, и снизу под ними как я понимаю работу оного.

public static void main (String [] args)
    {
        HashMap<String, String> map = createMap();
        removeTheFirstNameDuplicates(map);
        for (Map.Entry<String, String> para : map.entrySet())
        {
            String name = para.getKey();
            String nameTwo = para.getValue();
            System.out.print(name + " " + nameTwo);
            System.out.println(" ");
        }
    }

Вызывается метод createMap, по которому создается карта из десяти людей (фамилия — имя).
Вызывается метод removeTheFirstNameDuplicates(map), с переданной ему в качестве аргумента картой map, далее вывод уже отредактированной map.

public static HashMap<String, String> createMap()
    {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("Сорока", "Игорь");
        map.put("Петров", "Игорь");
        map.put("Котовский", "Валера");
        map.put("Коновальский", "Валера");
        map.put("Петровский", "Олег");
        map.put("Романчук", "Олег");
        map.put("Корчевский", "Петр");
        map.put("Эндис", "Иван");
        map.put("Нестор", "Иван");
        map.put("Дорн", "Иван");

        return map;

    }

Создается карта из десяти людей, и возвращается карта map.

public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
       HashMap<String, String> copy = new HashMap<String, String>(map);
       for (Map.Entry<String, String> para : copy.entrySet())
       {
           for (Map.Entry<String, String> paraTwo : map.entrySet())
           {
               if (para.getValue().equals(paraTwo.getValue()))
                   removeItemFromMapByValue(map, paraTwo.getValue());
               break;
           }
       }
    }

map копируется в copy.
Первый цикл: получаем пару ключ-значение по copy, далее по внутреннему циклу получаем пару из map, и если значение (имя) в copy эквивалентное значению в map, то вызываем метод removeItemFromMapByValue(map, paraTwo.getValue()) с переданными ему в качестве аргументов value из map и саму map, и выходим из внутреннего цикла, и начинаем первый for заново.

public static void removeItemFromMapByValue(HashMap<String, String> map, String value)
    {
        HashMap<String, String> copy = new HashMap<String, String>(map);
        for (Map.Entry<String, String> pair: copy.entrySet())
        {
            if (pair.getValue().equals(value))
                map.remove(pair.getKey());
        }
    }

В данном методе принимаем map и его value в качестве аргументов.
Создаем копию map, получаем пару из copy, и если value в copy эквивалентно переданному value, то удаляем эту ячейку в карте по ключу. Как бы это смешно не звучало, но я вообще не понял зачем нужно ещё раз создавать копию мэп. Разве нельзя сразу удалить значение в первом методе?

Вывод моего говнокода:

Эндис Иван
Корчевский Петр
Нестор Иван
Дорн Иван

  Если я правильно понял, то когда мы копируем карту, то её копия создается с такими же парами, но в случайном порядке. В методе removeTheFirstNameDuplicates мы берем первую пару из копии, и сравниваем её по-очереди со всеми парами из мэп, и когда находится парами с одинаковыми значениями, то мы вызываем метод removeItemFromMapByValue. В последнем методе мы снова создаем копию мэп, и ищем в ней пару с переданным значением (value), после чего удаляем данную ячейку в мэп. Спасибо за любые подсказки, ссылки на статьи, критику и т.д.

P.S. чувствую что что-то в корне неправильно понял, поэтому мне так тяжело осилить данную задачку.
  • ,

level08.lesson08.task03

I need somebody help! Как я понял, первый элемент не добавляется, не понимаю почему?

/* Одинаковые имя и фамилия
Создать словарь (Map<String, String>) занести в него десять записей по принципу «Фамилия» — «Имя».
Проверить сколько людей имеют совпадающие с заданным имя или фамилию.
*/
public class Solution
{

    public static void main(String[] args)
    {
        Map<String, String> map = createMap();

        getCountTheSameFirstName((HashMap<String, String>) map, "1");
        getCountTheSameLastName((HashMap<String, String>) map, "2");
    }

    public static HashMap<String, String> createMap()
    {
        //Напишите тут ваш код
        Map<String, String> map = new HashMap<String, String>();

        map.put("1", "2");
        map.put("3", "4");
        map.put("5", "6");
        map.put("7", "8");
        map.put("9", "0");
        map.put("1", "10");
        map.put("11", "2");
        map.put("4", "3");
        map.put("12", "13");
        map.put("14", "2");

        return (HashMap)map;
    }

    public static int getCountTheSameFirstName(HashMap<String, String> map, String name)
    {
        //Напишите тут ваш код
        int count = 0;
        for (Map.Entry<String, String> pair : map.entrySet())
        {
            String key = pair.getKey();
            if (key.equals(name))
                ++count;
        }
        return count;
}

    public static int getCountTheSameLastName(HashMap<String, String> map, String familiya)
    {
        //Напишите тут ваш код
        int count = 0;
        for (Map.Entry<String, String> pair : map.entrySet())
        {
            String value = pair.getValue();
            if (value.equals(familiya))
                ++count;
        }
        return count;
    }
}
  • ,

level08.lesson08.task03

Не проходит тестирование с/без main() на сервере. Intellij все правильно компилирует и показывает.
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/* Одинаковые имя и фамилия
Создать словарь (Map<String, String>) занести в него десять записей по принципу «Фамилия» - «Имя».
Проверить сколько людей имеют совпадающие с заданным имя или фамилию.
*/

public class Solution
{
    public static void main(String[] args)
    {
        Map<String, String> hashMap = createMap();
        int a = getCountTheSameFirstName(hashMap, "Artem");
        int b = getCountTheSameLastName(hashMap, "Name");
        System.out.println(a+" "+b);
    }

    public static Map<String, String> createMap()
    {
        Map<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("Name1", "Artem");
        hashMap.put("Name2", "Artem");
        hashMap.put("Name3", "Anton");
        hashMap.put("Name4", "Anton");
        hashMap.put("Name5", "Liza");
        hashMap.put("Name6", "Katia");
        hashMap.put("Name7", "Marina");
        hashMap.put("Name8", "Marina");
        hashMap.put("Name9", "Misha");
        hashMap.put("Name10", "Liza");
        return  hashMap;
    }

    public static int getCountTheSameFirstName(Map<String, String> map, String name)
    {
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        int count = 0;
        while (iterator.hasNext())
        {
            if(iterator.next().getValue().equals(name))
                count++;
        }
            return count;
    }

    public static int getCountTheSameLastName(Map<String, String> map, String familiya)
    {
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        int count = 0;
        while (iterator.hasNext())
        {
            if(iterator.next().getKey().equals(familiya))
                count++;
        }
        return count;
    }
}