Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Название темы включает слова - "Помогите", "Спасите", "Срочно"
Название темы не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте >>>правила <<< и заново правильно создайте тему.
 
Опции темы
Старый 08.06.2016, 15:45   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
Репутация: -101
По умолчанию Удалить людей, имеющих одинаковые имена

Добрый день !

Можно ли как то оптимизировать этот код в методе

Код:
public static void removeTheFirstNameDuplicates(HashMap<String, String> map)?
Условия задачи

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

Код:
package com.javarush.test.level08.lesson08.task05;

import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.lang.*;
import java.io.*;


public class Solution
{
    public static HashMap<String, String> createMap()
    {
        HashMap<String, String> map = new HashMap<String, String>();
    map.put("1", "Mama");
    map.put("2", "Mila");
    map.put("3", "Ramu");
    map.put("4", "Mama");
    map.put("5", "Mila");
    map.put("6", "Ramu");
    map.put("7", "Mama");
    map.put("8", "Mila");
    map.put("9", "Ramu");
    map.put("10", "Mama");
    
    return map;

    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        ArrayList<String> list_1 = new ArrayList<String>();
		ArrayList<String> list_2 = new ArrayList<String>();
		 for (Map.Entry<String, String> pair: map.entrySet()) 
		 {
		     list_1.add(pair.getValue());
		 }
       boolean l = false;
	String s;	 
    for (int i=0;i<list_1.size()-1;i++)
    {
    	s = list_1.get(i);
    	for (int j=i+1;j<list_1.size();j++)
    	{
    		if (list_1.get(j).equals(s))
    		{
    			list_1.remove(j);
    		    j--;
    			l = true;
    		}
    	}
    	if (l)
    	{
    		list_1.remove(i);
    		i--;
    		l = false;
    		list_2.add(s);
    	}
    }
    for (int i=0;i<list_2.size();i++) 
    {
        removeItemFromMapByValue(map, list_2.get(i));
    }
    }

    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());
        }
    }
}
RAFA91 вне форума  
Старый 08.06.2016, 16:55   #2
TaLadno
Форумчанин
 
Регистрация: 03.06.2015
Сообщений: 395
Репутация: 346
По умолчанию

Вряд ли будешь читать, но Sort EntrySet, values отсортируй словарь по значению и в обратном проходе удаляй дубль, если есть совпадение с "следующим"

на яве не писал никогда, ну ваще ни разу.
__________________
Вы там держитесь.

Последний раз редактировалось TaLadno; 08.06.2016 в 17:25. Причина: Подставил якорь в ссыль, а то ведь не найдет
TaLadno вне форума  
Старый 09.06.2016, 14:06   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
Репутация: -101
По умолчанию

может есть метод который считает к-во дублирующих значений в карте ?

в с++ в мультикарте еть метод который позволяет вывести к-во дублирующих ключей.

про к-во значений не слыхал.
RAFA91 вне форума  
Старый 09.06.2016, 18:29   #4
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,995
Репутация: 3436

icq: 446843180
skype: phoenix_proger
По умолчанию

в вашем случае во время поиска дубликатов нет смысла сохранять значения, вам важнее ключи этих дублей.
получим примерно это:
Код:
public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        ArrayList<String> valuesL = new ArrayList<String>();
        ArrayList<String> toDeleteL = new ArrayList<String>();
		for (Map.Entry<String, String> pair: map.entrySet()) 
		{
		     if(valuesL.contains(pair.getValue())
		     	toDeleteL.add(pair.getKey());
		     else
		     	valuesL.add(pair.getValue());
		}
		for(String key: toDeleteL)
		{
			map.remove(key);
		}
    }
код не проверял, но смысл должен быть ясен.

+ а вам точно надо позволять добавлять дубликаты имен сначала?
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 09.06.2016 в 18:39.
Пепел Феникса вне форума  
Старый 10.06.2016, 17:32   #5
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
Репутация: -101
По умолчанию

этот код не работает как надо. оставлю тогда свой вариант.

этот кусок кода менять нельзя. он вставлен генератором кода явараш

Код:
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());
        }
    }
RAFA91 вне форума  
Старый 11.06.2016, 05:03   #6
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,995
Репутация: 3436

icq: 446843180
skype: phoenix_proger
По умолчанию

Цитата:
этот кусок кода менять нельзя. он вставлен генератором кода явараш
с этого и стоит начинать.
там просто иные принципы оценки подходит/не подходит.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума  
Старый 11.06.2016, 13:11   #7
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
Репутация: -101
По умолчанию

принцип там только один. нужно решить задачи и получить баллы что-бы иметь возможность перейти на следующий уровень.

какое отношение вы имеете к яве и ява раш?
RAFA91 вне форума  
Старый 11.06.2016, 13:19   #8
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,995
Репутация: 3436

icq: 446843180
skype: phoenix_proger
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
какое отношение вы имеете к яве и ява раш?
я разве где-то говорил что имею отношение к JavaRush?

на яве писал ранее.
+ сейчас немного пишу.
Цитата:
принцип там только один. нужно решить задачи и получить баллы что-бы иметь возможность перейти на следующий уровень.
ну я про это и говорю, там иной критерий оценки.
(просто я на работе добился бы увольнения коллеги за такой код...точнее добился, ибо он никак не понимал что не надо так, а программа все тупила и тупила)
Цитата:
этот код не работает как надо.
не убирает дубли?
убирает вполне.

если же надо именно задействовать метод что они дали, то так:
Код:
public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        ArrayList<String> valuesL = new ArrayList<String>();
        ArrayList<String> toDeleteL = new ArrayList<String>();
		for (Map.Entry<String, String> pair: map.entrySet()) 
		{
		     if(valuesL.contains(pair.getValue())
		     	toDeleteL.add(pair.getValue());
		     else
		     	valuesL.add(pair.getValue());
		}
		for(String val: toDeleteL)
		{
			removeItemFromMapByValue(map,val);
		}
    }

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());
        }
    }
правда в принципе это тот же код что и ваш, просто вместо вложенного цикла contains.
ну и первого цикла нет(ибо не вижу смысла копировать данные)
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума  
Старый 12.06.2016, 17:36   #9
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
Репутация: -101
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я

+ сейчас немного пишу.
)
а вы что на всех языках пишите ? то писали на CLI то на шарпе

вин апи .что то там ++ . а теперь и на яве. что еще не назвал
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я
не убирает дубли?
)
мой вариант тоже убирает дубли и что ?

мне нужен метод который считает к-во дублированных значений и он в коллекциях сто процентов есть.


Код:
for (Map.Entry<String, String> pair: map.entrySet()) 
		{
		     if(valuesL.contains(pair.getValue())
		     	toDeleteL.add(pair.getValue());
		     else
		     	valuesL.add(pair.getValue());
		}
ну да. может это и вариант проверять список на дубликаты. .только в toDeleteL могут быть несколько дубликатов.

наверное надо еще сделать проверку и для toDelete

Последний раз редактировалось RAFA91; 12.06.2016 в 17:49.
RAFA91 вне форума  
Старый 12.06.2016, 20:05   #10
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,995
Репутация: 3436

icq: 446843180
skype: phoenix_proger
По умолчанию

Цитата:
а вы что на всех языках пишите ? то писали на CLI то на шарпе
вин апи .что то там ++ . а теперь и на яве. что еще не назвал
из того на чем писал это: Delphi, C++, C#, HTML/JS, Java, SQL, SmallTalk.
+ много еще с чем знаком.
около 10 лет опыта и работы.

ну да ладно, не будем ссорится и оффтопить.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума  
Закрытая тема

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из каталога все файлы, кроме файлов, имеющих в названии заданную последовательность символов\ Shell Nickolay0512 Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 16.02.2014 16:26
Одинаковые имена Ramirag C# (си шарп) 4 29.08.2011 09:09
Передача параметров в функции(Одинаковые имена дефолта и передаваемого параметра) это плохо? Человек_Борща Общие вопросы Delphi 3 13.04.2011 16:54
суммировать одинаковые имена stbo Microsoft Office Excel 4 29.06.2010 12:51
удалить в строке все одинаковые символы Михаил70 Помощь студентам 5 09.09.2009 18:35


17:23.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru