Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избежать двойников в списке? Добавление в List<String> 
V
    Опции темы
knopka
Дата 15.3.2012, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 17.1.2006
Где: Россия: Петербург

Репутация: 1
Всего: 1



Есть список имён хранящийся в  
Код

List<Stirng>


необходимо:
 при добавлении в список нового имени проверить нет ли такого в списке,
и если есть то прибавить к имени 1 или ....

то есть при многократном добавлении  одного и того же имени (например - temp) список должен быть типа того:
temp
temp1
temp12
temp123
   

или 

I]temp
temp1
temp2
temp3[/I] 

Подскажите пожалуйста алгоритм!  

сейчас делаю так:
Код

          for(String et: listNames){
              if(et.equals(name)){
                  name += i;    // TODO modify algoritm
                  i++;
              }
          }


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


PM MAIL ICQ   Вверх
arcsupport
Дата 15.3.2012, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 24.10.2008

Репутация: 1
Всего: 2



Смотри сюда http://forum.vingrad.ru/act-ST/f-104/t-305998.html

Это сообщение отредактировал(а) arcsupport - 15.3.2012, 18:37
PM MAIL   Вверх
Stolzen
Дата 15.3.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Используйте LinkedHashSet


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Samotnik
Дата 15.3.2012, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



knopka, как-то так?
Код

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Main  {
    
    static Set<String> stringsList = new HashSet<String>(Arrays.asList("one", "two", "three", "four", "five", "six", "seven"));        
    
    public static void main(String ... args) {
        String[] addWords = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
        for (String str : addWords) {
            if (!stringsList.add(str)) {
                stringsList.add(str + "1");
            }
        }
        for (String str : stringsList) {
            System.out.println(str);
        }
    }
    


Добавлено через 3 минуты и 46 секунд
Цитата(Stolzen @  15.3.2012,  20:59 Найти цитируемый пост)
Используйте LinkedHashSet 

Почему именно этот класс? Он же синхронизированный, значит медленный.
PM MAIL   Вверх
knopka
Дата 15.3.2012, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 17.1.2006
Где: Россия: Петербург

Репутация: 1
Всего: 1



Спасибо всем кто откликнулся... но видимо я не совсем понятно всё объяснил...

List<String> - принципиально, он используется ещё кучей разных методов, 
к тому же я предельно всё упростил, что бы не грузить коллег не нужной информацией ...

А алгоритм должен работать как то так:

проверяем добавляемое имя например  ТЕСТ 
такое имя уже есть - пытаемся добавить ТЕСТ1
если есть такое - пытаемся добавить ТЕСТ2
если есть такое - пытаемся добавить ТЕСТ3
.........
если есть такое  - пытаемся добавить ТЕСТn 
если такого нет то добавляем ТЕСТn в список   


PM MAIL ICQ   Вверх
Mirkes
Дата 16.3.2012, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Вроде бы List имеет indexOf. Зачем перебирать элементы вручную?
что-то вроде 
Код

  while (listNames.indexOf(str)==-1)
     str+=1;
  listNames.add(str);



--------------------
Mirkes
PM MAIL   Вверх
Stolzen
Дата 16.3.2012, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(Samotnik @  15.3.2012,  22:22 Найти цитируемый пост)
Почему именно этот класс? Он же синхронизированный, значит медленный. 

Откуда инфа? 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
LSD
Дата 16.3.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Samotnik @  15.3.2012,  22:22 Найти цитируемый пост)
Почему именно этот класс? Он же синхронизированный, значит медленный. 

1. Он не синхронизированный, о чем прямо говориться в документации.
2. Он сохраняет порядок добавления элементов в отличии от обычного HashSet.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Samotnik
Дата 16.3.2012, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



LSD, Stolzen,  упс. Почему-то слова:
Цитата

Note that this implementation is not synchronized.

Прочитал как
Цитата

Note that this implementation is synchronized.

 smile 
PM MAIL   Вверх
knopka
Дата 16.3.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 17.1.2006
Где: Россия: Петербург

Репутация: 1
Всего: 1



Попробовал написать алгоритм, к сожалению не работает.
Условие  с  equals не срабатывает... 
Exception StackOverflowError ...  и т.д.

Подскажите что не так?



Код

import java.util.ArrayList;
import java.util.List;


public class Main {

    private static String validateName(List<String> nameList, String name){
        int i = 0;
        int j = 0;
        boolean stop = true;

        do{
            String str1 = nameList.get(i);
            if(name.equals(str1)){
                name += j;
                stop = false;
                j++;
            }
            if(stop) name =  validateName(nameList, name);  // рекурсивно вызываем для повторной проверки
            i++;
        }while(!stop);

        return name;
    }

    public static void main(String[] args) {
        List<String> templateName = new ArrayList<String>();
        templateName.add("test4");
        templateName.add("test5");
        templateName.add("test2");
        templateName.add("test");
        templateName.add("test1");

        String str = validateName(templateName, "temp");
        System.out.println("newName : " + str);
    }
}


PM MAIL ICQ   Вверх
Shaggie
Дата 16.3.2012, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



Цитата(knopka @  15.3.2012,  23:38 Найти цитируемый пост)
List<String> - принципиально, он используется ещё кучей разных методов

Насколько принципиально? Какую такую задачу решает в вашем случае именно List, что нельзя вернуть Collection?

Цитата(knopka @  15.3.2012,  23:38 Найти цитируемый пост)
проверяем добавляемое имя например  ТЕСТ 
такое имя уже есть - пытаемся добавить ТЕСТ1
если есть такое - пытаемся добавить ТЕСТ2

Гипотетическая ситуация - строка является именем пользователя "VasyaPupkin1337", после инкремента получили "VasyaPupkin1338". Это правильно? Можете гарантировать, что аналогичной ситуации в жизни никогда-никогда-никогда не произойдёт?

Правильной задаче - правильная структура данных.
Моё такое ИМХО, что Map<String, Integer>, где ключом является строка, а значением - количество её вхождений, решает все проблемы и не создаёт новых.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
knopka
Дата 17.3.2012, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 17.1.2006
Где: Россия: Петербург

Репутация: 1
Всего: 1



to Shaggie

Цитата
VasyaPupkin1338
  - да, будет правильно...

Цитата

Можете гарантировать, что аналогичной ситуации в жизни никогда-никогда-никогда не произойдёт?


Не понял какой ситуации?  

VasyaPupkin1338  и дальше может инкриминироваться  пока в списке будут такие же имена

только когда, например VasyaPupkin2012 , будет уникальным для списка - алгоритм закончит работу



 


PM MAIL ICQ   Вверх
Stolzen
Дата 17.3.2012, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(knopka @  17.3.2012,  00:19 Найти цитируемый пост)
Попробовал написать алгоритм, к сожалению не работает.
Условие  с  equals не срабатывает... 
Exception StackOverflowError ...  и т.д.

Что вы хотели получить от этого кода? Что именно должна делать функция validateName? 

Цитата(Shaggie @  17.3.2012,  00:31 Найти цитируемый пост)
Моё такое ИМХО, что Map<String, Integer>, где ключом является строка, а значением - количество её вхождений, решает все проблемы и не создаёт новых. 

Поддерживаю. А еще есть такая вещь, как Bag (commons collections) или Multiset (guava collections) - рекомендую.

Добавлено через 2 минуты и 17 секунд
Да, еще, может вы немного расскажите о решаемой задаче? Возможно, существуют более простые способы ее решения. 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Mirkes
Дата 17.3.2012, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Цитата(knopka @ 16.3.2012,  23:19)
Попробовал написать алгоритм, к сожалению не работает.
Условие  с  equals не срабатывает... 
Exception StackOverflowError ...  и т.д.

Подскажите что не так?



Код

    private static String validateName(List<String> nameList, String name){
        int i = 0;
        int j = 0;
        boolean stop = true;

        do{
            String str1 = nameList.get(i);
            if(name.equals(str1)){
                name += j;
                stop = false;
                j++;
            }
            if(stop) name =  validateName(nameList, name);  // рекурсивно вызываем для повторной проверки
            i++;
        }while(!stop);

        return name;
    }


По большому счету все не так. Вы проовали читать свой текст?
Пусть добавляемое имя не совпало с первым именем в списке. Тогда if  не сработает
и stop останется истиной. Следовательно будет произведен повторный вызов. В котором произойдет тоже самое.
Естественное следствие этого алгоритма - stack overflow. А чего Вы хотели?

Если же имя не дай бог совпало с первым элементом списка, то stop станет ложью. Повторного вызова не будет, но зато цикл будет крутиться до возникновения исключения по выходу за границу набора индексов. Обработки исключения нет. Контроля индексов тоже нет.

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

Возможно есть смысл воспользоваться другим видом коллекции, как Вам советовали. Но если Вы настаиваете на List, то почему не хотите использовать нормально его методы?

Это сообщение отредактировал(а) Mirkes - 17.3.2012, 19:51


--------------------
Mirkes
PM MAIL   Вверх
Pawl
Дата 17.3.2012, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(knopka @  17.3.2012,  00:40 Найти цитируемый пост)
VasyaPupkin1338  - да, будет правильно...

Пардон, а как же написанное Вами выше:
Цитата(knopka @  15.3.2012,  18:29 Найти цитируемый пост)
temp
temp1
temp12
temp123 
? Может, тогда после VasyaPupkin1337 должно идти VasyaPupkin13378?
Прошу, уточните: если надо просто подсчитать количество слов в тексте, то тут, как Вам уже советовали лучше использовать Map, а если вывод должен быть именно temp1, temp12, temp123 и т. д., это уже интереснее, я над этим подумаю! smile  smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.