Модераторы: 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   Вверх
Pawl
Дата 17.3.2012, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот, посмотрите, это то, что Вам надо? Я руководствовался условием:
Цитата(knopka @  15.3.2012,  18:29 Найти цитируемый пост)
 при добавлении в список нового имени проверить нет ли такого в списке,и если есть то прибавить к имени 1 или ....

Запустите программу и введите в консоль несколько раз слово temp
Посмотрите вывод. Для выхода введите 0.
P. S. Писал "на коленке", код не оптимальный, но рабочий. Если надо, могу оптимизировать.
P. P. S. Помню, знакомый junior программером устраивался, ему нечто похожее задавали smile .
Код

import java.util.*;

public class Main_1 {
    private static List<String> templateName = new ArrayList<String>();
    private static HashMap<String, String> tn = new HashMap<String, String>();
    
    static {
        templateName.add("ttt");
        templateName.add("tst");
        templateName.add("tmp");
        templateName.add("test");
        templateName.add("temp");
                          
        for (String s : templateName) {
         tn. put (s, "");
        }     
    }
        
    public static void main(String[] args) {
     System.out.println("input a word");    
        Scanner sc = new Scanner(System.in);                
         while (true) {
          String s = sc.next();
          if (s.equals("0")) {
              System.exit(0);
          }
          
            if (templateName.contains(s)) {
             if (tn.get(s) == "") {
                 templateName.add(s + 1);
                 tn.put(s, "1");
             } else {
                 char n = tn.get(s).charAt(tn.get(s).length() - 1);
                 System.out.println(n);
                 String nn = new Character(n).toString();
                 int i = Integer.parseInt(nn) + 1;
                 nn = tn.get(s) + i;
                 templateName.add(s + nn);
                 tn.put(s, nn);
             }
            }
                    
            System.out.println(templateName);
        }    
    }
}



--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
knopka
Дата 18.3.2012, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



to Pawl спасибо за программу...

to Mirkes спасибо за 
Цитата

Зачем перебирать List вручную, если можно воспользоваться indexOf?
 

после этого наступило просветление  smile 

Просьба покритиковать окончательное решение

Код

    private static String validateName(List<String> nameList, String name){
        int i =0, j = 1;
        while(i != -1){
            i = nameList.indexOf(name);
            if(i >= 0){
                name +=j; j++;
            }
        }
        return name;
    }

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

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


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


Опытный
**


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

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



Цитата(knopka @  18.3.2012,  00:33 Найти цитируемый пост)
Просьба покритиковать окончательное решение

я не понял, а зачем тогда Вы ранее писали, что должно быть так:
Цитата(knopka @  15.3.2012,  18:29 Найти цитируемый пост)
то есть при многократном добавлении  одного и того же имени (например - temp) список должен быть типа того:
temp
temp1
temp12
temp123  
? Для дезинформации? smile 
Для определения, есть ли в списке искомый элемент, лучше вместо 
Код

        while(i != -1){
            i = nameList.indexOf(name);
            if(i >= 0){
                name +=j; j++;
            }
        }

написать так:
Код

            if(nameList.contains(name)){
                name +=j; j++;
            }

эффект тот же, но понятнее, короче и меньше переменных. А если Вам непременно хочется использовать indexOf() - уберите цикл, он тут лишний, т. к., если name есть в списке, он сработает ровно 1 раз, а если нет - прокрутится впустую, что увеличит время работы программы, а на результат никак не повлияет.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Mirkes
Дата 18.3.2012, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Pawl @ 18.3.2012,  08:45)
 А если Вам непременно хочется использовать indexOf() - уберите цикл, он тут лишний, т. к., если name есть в списке, он сработает ровно 1 раз, а если нет - прокрутится впустую, что увеличит время работы программы, а на результат никак не повлияет.

Не совсем так. Поскольку name меняется в цикле то цикл действительно нужен.
Вариант с contains вполне возможен. Думаю от дает тот-же ответ, просто без указания места в списке. 
Так что с ним тоже нужен будет цикл типа
Код

    int j=0
    while (nameList.contains(name)){
         name +=j; j++;
    }


Этот вариант мне то же нравится больше чем с indexOf, просто я не знал о contains smile .


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


Опытный
**


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

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



Цитата(Mirkes @  18.3.2012,  11:46 Найти цитируемый пост)
Поскольку name меняется в цикле то цикл действительно нужен.

Тогда надо менять логику метода. Вы запустите код и посмотрите как он работает: что есть цикл, что его нет, на выходе все-равно test1.
Даже если в списке дважды встречается test, test12 не получается.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Pawl
Дата 18.3.2012, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хотя, нет, не надо. Если в список добавить test1, то да, test12 получится.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 19.3.2012, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ТС-у категорически советую понять, что такое класс сложности. А если не в состоянии - пусть берет какой-нибудь LinkedHashSet и не парится.
PM MAIL   Вверх
Pawl
Дата 19.3.2012, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ИМХО, совершенно непонятно, какое практическое применение у данной задачи! Я сужу по ее формулировке и приведенной реализации. Даже для тестовой она выглядит извращенно... А я тут извратился еще больше smile - сделал рекурсивный вариант решения - как изначально пытался сделать автор. Результат получается точь в точь, как в его реализации с циклом smile!
Код

import java.util.*;

public class Main {
    private static int j;
    
    private static String validateName(List<String> nameList, String name, int i) {
        if(nameList.contains(name)) {
            name += ++j;                 
        }
        
        i++;
        return (i < nameList.size()) ? validateName(nameList, name, i) : name;
    }

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

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



--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 19.3.2012, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Pawl @  19.3.2012,  19:41 Найти цитируемый пост)
name += ++j;                 
        }
        
        i++;

Сишники тут не нужны.
PM MAIL   Вверх
Pawl
Дата 19.3.2012, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



smile

Добавлено через 57 секунд
что интересно, никогда на С не писал!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
knopka
Дата 19.3.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



to Pawl посмотрите заголовок поста: Как избежать двойников в списке   - двойников нет? нет! значит алгоритм работает.

и  в вопросе я писал 
Цитата

список должен быть типа того:
     ключевое слово - типа того

Цитата

какое практическое применение у данной задачи

задачу описал в предельно упрощённом виде, String и name - тоже упрощение. 
В реальности всё намного, намного сложнее.  
Но зачем утомлять коллег ненужной информацией... ну привёл бы я полное описание задачи строк на 400, кто бы его прочитал?
Вы? Приведённого описания на мой взгляд вполне хватало для выбора алгоритма

to Karadul
Цитата

пусть берет какой-нибудь LinkedHashSet

прежде, чем писать - прочитайте предыдущие сообщения!

Я же не спрашивал, какой тип коллекции использовать, зачем тогда предлагать тоже, что уже предлагали.

Добавлено через 29 секунд
Вопрос решён
PM MAIL ICQ   Вверх
Pawl
Дата 20.3.2012, 08:21 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(knopka @  19.3.2012,  23:19 Найти цитируемый пост)
значит алгоритм работает.

Так я чё? Я ж ни чё - работает и слава Богу! Как гласит золотое правило программиста: работает - не трогай! smile
Цитата(knopka @  19.3.2012,  23:19 Найти цитируемый пост)
и  в вопросе я писал Цитатасписок должен быть типа того:     ключевое слово - типа того

ну, значит и решение должно быть, типа, того! smile  smile
А серьезно - главное, что Вы разобрались с Вашей проблемой.smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 21.3.2012, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



О господи! Модеры! Знающие люди! Вы здесь есть? Сделайте что-нибудь! Почему все толкают алгоритмы  с O(n) и все молчат?

Вот, почитайте.
PM MAIL   Вверх
Mirkes
Дата 22.3.2012, 18:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @ 21.3.2012,  11:44)
О господи! Модеры! Знающие люди! Вы здесь есть? Сделайте что-нибудь! Почему все толкают алгоритмы  с O(n) и все молчат?

Вот, почитайте.

Гм... Господину Kardual действительно следует сделать замечание.
Во первых, не прочитав постановку задачи и обсуждения дает рекомендации в несколько грубоватой форме.
Во ворых, не задумывается над тем, что пишет.
В третьих, рекомендует материал, решающий совершенно (принципиально) другую задачу.
В четвертых, говорит о классах сложности, но видимо не совсем четко понимает как определить класс сложности задачи.
В пятых поучает более опытных коллег по поводу использования или не использования синтаксиса языка Java. То что синтаксис языка С-подобен не вина и не заслуга пользователя, а просто факт.
Прошу прощения, если получилось грубовато.


--------------------
Mirkes
PM MAIL   Вверх
Karadul
Дата 22.3.2012, 19:27 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mirkes @  22.3.2012,  18:05 Найти цитируемый пост)
В четвертых, говорит о классах сложности, но видимо не совсем четко понимает как определить класс сложности задачи.


Чё, серьезно?
Код

          for(String et: listNames){

Класс сложности будет O(n). Обьяснить почему или сам догадаешься? С HashMap был бы O(1).

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

Контрукция с ++ была убогая, и вообще замечание было полушутливое. А вот использование плохого класса сложности - просчет очень серьезный.

А вот тебе бы в самый раз попытаться понять чужие посты, прежде чем пытаться их критиковать (выхлоп выше на критику не тянет).

Сорри если грубовато получилось. Хотя так надо smile

Цитата(Pawl @  20.3.2012,  08:21 Найти цитируемый пост)
Как гласит золотое правило программиста: работает - не трогай!

Почитай ссылочку выше. Работать то работало, но как строк стало не 20, а 20 тысяч, работать стало крайне хреново.
Не уважают у вас тут класс сложности. Это только жавоиды или вообще все русские школолопрограммисты?

Это сообщение отредактировал(а) Karadul - 22.3.2012, 19:30
PM MAIL   Вверх
Pawl
Дата 22.3.2012, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mirkes @  22.3.2012,  18:05 Найти цитируемый пост)
Господину Kardual действительно следует сделать замечание.

Поддерживаю! Однозначный хам.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 22.3.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как аукнется, знаете ли.

Попка пригорела, лодыри? smile

Это сообщение отредактировал(а) Karadul - 22.3.2012, 23:03
PM MAIL   Вверх
LSD
Дата 23.3.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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




M
LSD
Karadul, замечание насчет сложности справедливое, но хамишь ты напрасно.
Цитата(Karadul @  22.3.2012,  23:23 Найти цитируемый пост)
Попка пригорела, лодыри?

Предлагаю тебе в пятидневный срок реализовать алгоритм со сложностью хотя бы O(log(n)), соблюдая исходное условие про List<String>. Сможешь - молодец и замечания по делу. Не сможешь/не станешь - твои замечания троллинг и поступать с тобой надо как с троллем.



--------------------
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   Вверх
Karadul
Дата 23.3.2012, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @  23.3.2012,  14:18 Найти цитируемый пост)
замечание насчет сложности справедливое, но хамишь ты напрасно.

Где тут хамство? Быстро, решительно!

Конвертировать List в какой-нить Set. Если не позволяют условия - поменять их. Или вы всерьез будете отвечать на вопрос "Как отверткой чистить зубы? Отверткой потому что по условиям задачи так надо".
PM MAIL   Вверх
LSD
Дата 23.3.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Меньше слов, больше кода smile 


--------------------
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   Вверх
Pawl
Дата 23.3.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @  22.3.2012,  19:27 Найти цитируемый пост)
Это только жавоиды или вообще все русские школолопрограммисты

Казахские программисты - самые суровые программисты в мире! Казахские программисты настолько суровы, что вообще не пользуются компьютером... smile

Добавлено через 1 минуту и 17 секунд
Пы Сы Как аукнется, знаете ли.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 23.3.2012, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

import java.util.*;
public class Main {
    private static int j;
    
    private static String validateName(Set<String> nameList, String name, int i) {
        if(nameList.get(name) != null) {
            name += ++j;                 
        }
        
        i++;
        return (i < nameList.size()) ? validateName(nameList, name, i) : name;
    }

    public static void main(String[] args) {
        Set<String> templateName = new HashSet<String>();
        templateName.add("test4");
        templateName.add("test5");
        templateName.add("test12");
        templateName.add("test2");
        templateName.add("test");        
        String str = validateName(templateName, "test", 0);
        System.out.println("newName : " + str);
    }
}

Еще что-нибудь?
PM MAIL   Вверх
knopka
Дата 23.3.2012, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



to Karadul

пример не рабочий
Цитата

Код

if(nameList.get(name) != null) {



cannot find symbol method get(java.lang.String)

условие не выполнено
Цитата

соблюдая исходное условие про List<String>


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


Опытный
**


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

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



Цитата(knopka @  23.3.2012,  21:33 Найти цитируемый пост)
пример не рабочий

У меня эклипс не запускается. Вы ж спецы, поправить сможете, да? Или тут бесплатное программирование на заказ? smile


Цитата(knopka @  23.3.2012,  21:33 Найти цитируемый пост)
соблюдая исходное условие про List<String>

Сконвертируй в Set. Скажи поставившему условие, что он не прав. См. выше про отвертку.
PM MAIL   Вверх
dorogoyIV
Дата 24.3.2012, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



подведем итоги:
Цитата

Как избежать двойников в списке? (соблюдая исходное условие про List<String>)

есть метод contains... (его предлагали)
если вы считаете, что, вы напишете лучше (оптимальнее), то флаг вам в руки!

Цитата(Karadul @  23.3.2012,  21:58 Найти цитируемый пост)
Скажи поставившему условие, что он не прав.

наверное это не возможно  smile 
видимо ТС надо немного переделать рабочую программу

ну говорили же - "работает - не лезь!!!"  smile 
PM MAIL   Вверх
Pawl
Дата 24.3.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @  23.3.2012,  21:58 Найти цитируемый пост)
У меня эклипс не запускается. Вы ж спецы, поправить сможете, да? Или тут бесплатное программирование на заказ?

Вас никто не просил работать бесплатно, Вас просили ответить за слова, с чем Вы, собственно, не справились.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 24.3.2012, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Pawl, такую вещь, как заменить метод на нужный, ты и сам можешь сделать, или за тебя пеленки менять нужно?

Код

import java.util.*;
public class Main {
    private static int j;
    
    private static String validateName(Set<String> nameList, String name, int i) {
        if(nameList.contains(name)) {
            name += ++j;                 
        }
        
        i++;
        return (i < nameList.size()) ? validateName(nameList, name, i) : name;
    }
    public static void main(String[] args) {
        Set<String> templateName = new HashSet<String>();
        templateName.add("test4");
        templateName.add("test5");
        templateName.add("test12");
        templateName.add("test2");
        templateName.add("test");        
        String str = validateName(templateName, "test", 0);
        System.out.println("newName : " + str);
    }
}


Цитата(dorogoyIV @  24.3.2012,  03:08 Найти цитируемый пост)
есть метод contains... (его предлагали)

... который работает через for c O(n). Более того, Set содержит тот же метод.

Цитата(dorogoyIV @  24.3.2012,  03:08 Найти цитируемый пост)
видимо ТС надо немного переделать рабочую программу

А переделать тип переменной из ArrayList в подходящий Set - это на грани выполнимого? Все остальное останется тем же.
PM MAIL   Вверх
Mirkes
Дата 26.3.2012, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Для особо одаренных поясню, что класс сложности определяется в контексте ВСЕГО ПРОЕКТА, а не в контексте конкретного фрагмента. Если в большинстве мест НУЖЕН List, то и в данном конкретном месте ПРИДЕТСЯ использовать List.
А общий треп по поводу О(1) и О(n) к делу не относится.
Автору предлагали использовать Hash, но он указал, что в других частях проекта используется List и выбора у него НЕТ.
Я дискуссию прекращаю.


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


Leprechaun Software Developer
****


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

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



Цитата(Karadul @  24.3.2012,  13:36 Найти цитируемый пост)
А переделать тип переменной из ArrayList в подходящий Set - это на грани выполнимого?

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




--------------------
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   Вверх
Karadul
Дата 26.3.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @  26.3.2012,  09:55 Найти цитируемый пост)
А прочесть условие это на грани выполнимого?

Цитата(Karadul @  23.3.2012,  14:44 Найти цитируемый пост)
Или вы всерьез будете отвечать на вопрос "Как отверткой чистить зубы? Отверткой потому что по условиям задачи так надо". 


Можно скопировать локально List в Set, если надо за раз проверить больше 1 имени. Можно заменить List на Set, который сохраняет порядок, и в остальных местах ты эту разницу просто не заметишь.
Если список с именами вряд ли будет большим и поиск в нем будет редко использоваться, то можно и так оставить. Но лучше так не делать.

Цитата(Mirkes @  26.3.2012,  04:05 Найти цитируемый пост)
А общий треп по поводу О(1) и О(n) к делу не относится.

Действительно, такие мелочи. Кроме меня, на них никто и внимания не обратил.
Надеюсь, мне с таким кодом дела иметь не придется.

Вот еще пример.
http://habrahabr.ru/post/137615/
Цитата

Коллега Редстоуна пояснил, что снижение производительности объясняются большим количеством структур O(n) в Git, что на больших размерах вызывает проблемы. 


Это сообщение отредактировал(а) Karadul - 26.3.2012, 13:17
PM MAIL   Вверх
Mirkes
Дата 26.3.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Обещал прекратить дискуссию, но не удержался.
Обидно, что простое обсуждение скатилось к общению на уровне "От дурака слышу" (эту фразу в научный мир ввел известный чам и гениальный физик Лев Ландау).
Сразу извинюсь перед студентом, что отвечать буду с позиции профессора и программиста, за плечами которого множество внедренных продуктов.
Мне приходилось преподавать технологию программирования и я прекрасно знаю разницу в сложности алгоритмов.
Однако в мне приходилось участовать в разработке проектов, когда определенная структура данных хорошо подходит для одной задачи в проекте и жутко тормозит в другой. Тогда как другая структура дданных прекрасно работает во втором месте и просто не пригодна (по времени обработки) в первом.
Иногда можно пойти на трансформацию структур данных, но это сильно зависит от сложности трансформации. Предлагаемая замена List на Set происходит с потерей информации. Причем эта информация (порядок записей) может быть очень важна.
Сегодня закончил научный проект в котором довольн долго колебался между Set и List. Для оценки что лучше пришлось реализовать оба варианта и проверить что даст выигрыш. В моем случае выигрыш дал List, поскольку обращение по индексу быстрее обращения по ключу, а в большинстве мест мне нужен был перебор всех элементов последовательно. Более того, в некоторых местах сначала формировал List, а затем трансформировал его в обычный массив. Это давало существенный выигрыш во времени.
Теперь о том проекте, который послужил темой для обсуждения. Я не знаю деталей, но судя по ряду ответов автора темы, добавление нового "пользователя" это частный случай работы со структурой. Во всех остальных местах нужен List. Ради получения выигрыша в одном месте Вы предлагаете поменять структуру всего проекта. Скорее всего это будет не эффективно, поскольку приведет к потере производительности в других местах. Второе Ваше предложение - делать локальное преобразование не выдерживает никакой критики в случае больших массивов данных. Преобразование будет работать мног дольше, чем поиск одного или нескольких имен. В случае последовательного внесения нескольких имен возникнет еще более сложная проблема - добавлять нужно будет сразу в обе коллекции.
Именно это я подразумевал под "общим трепом об О(0) и О(n)". Оценка сложности одного алгоритма актуальна только в том случае, когда способ ускорения не затрагивает других алгоритмов. В противном случае нужно оценивать эффективность для ВСЕХ алгоритмов, а не для одного выделенного.
Позволю себе профессорскиое отступление. Сегодня на лекции я обсуждал со студентами различие между учебными и реальными задачами в информатике.
В нашем случае учебная задача - задача о реализации одного алгоритма. А реальная задача, как правило, подразумевает несколько этапов обработки.
Надеюсь я достаточно четко объяснил причину того, что мы все согласились с условием автора поста, и обсуждали решение в рамках, заданных автором.


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


Опытный
**


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

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



Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
Сразу извинюсь перед студентом, что отвечать буду с позиции профессора и программиста, за плечами которого множество внедренных продуктов.

\m/ \m/ ? smile

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
Предлагаемая замена List на Set происходит с потерей информации. 

О порядке элементов? Set - это не тип, а интерфейс. Есть и Set с сохранением порядка элементов, LinkedHashSet, который предложили выше.

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
 а в большинстве мест мне нужен был перебор всех элементов последовательно

А для этого обязательно по чему-то обращаться? Есть же итераторы и foreach (вот не знаю можно ли в яве так сделать, но в питоне есть for key, value in hash.iteritems())

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
Второе Ваше предложение - делать локальное преобразование не выдерживает никакой критики в случае больших массивов данных. П

Преобразование имхо будет работать быстрее поиска нескольких имен подряд.

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
добавлять нужно будет сразу в обе коллекции.

Зачем держать параллельно List и Set, есть структуры, которые сочетают и порядок элементов, и поиск за O(1).

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
О(0)

Опечатка?

Собственно может получиться так, что геморрой с изменением других кусков кода может перевесить преимущество в скорости, если эта функция используется нечасто и список небольшой. Меня возмутило другое - никому в голову не пришло обратить внимание автора на класс сложности. 

Класс сложности одной операции имеет таки не абсолютный приоритет, но имеет. Может, лично у Вас (проект-то научный? вычислялка какая-то?) это оказалось не так, но как правило, будет наоборот, и проверить в любом случае не помешает. То есть, позиция по умолчанию - брать структуру с лучшим классом сложности на типичных операциях, иной выбор должен быть обоснован. У Вас он был обоснован (тесты ведь проводили?). 
Иначе будет как с Git. Сишники этим славились (не знаю, как сейчас) - нужных структур данных искаропки нет, или пишем свои с ошибками, или используем массив вместо хеш-массива, т.к. реализовать проще, а на класс сложности пох. 





Это сообщение отредактировал(а) Karadul - 26.3.2012, 19:02
PM MAIL   Вверх
knopka
Дата 26.3.2012, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



to Karadul

Позволю себе как автору изложить своё видение вопроса.

Абстрактно:

Я как первоклассник спросил: как сложить 2 + 2, на что коллеги мне объяснили, что нужно к двум палочкам приложить ещё две палочки и посчитать получившееся количество. Меня устроил предложенный способ...
Но тут встревает ученик 11 класса и говорит: 
- Всё не так,  и это плохой очень сложный способ...
        Разве вы не знаете, что компьютер использует двоичную арифметику!
        нужно число два преобразовать в двоичный код и складывать, а потом полученный результат преобразовать!!!
 
Когда же 11 класснику предложили взять и показать как эти палочки преобразовать в двоичный код, он дал множество исчерпывающих ответов:

1. я не учитель, что бы бесплатно палочки перекладывать
Цитата

тут бесплатное программирование на заказ?

2. вашими палочками мне неудобно работать, они у меня в руки на помещаются
Цитата

У меня эклипс не запускается

3. ваши палочки плохо обструганы
Цитата

Кроме меня, на них никто и внимания не обратил.

4. и мне в жизни никогда не придётся складывать палочки
Цитата

Надеюсь, мне с таким кодом дела иметь не придется


--------- конец абстракции

То, что я не гуру программист на Java, ещё не значит, что я не разбираюсь в сложности алгоритмов. 
5 лет преподавания в ВУЗе предмета "Структуры и алгоритмы обработки данных" позволяют мне это утверждать. 

Меня устроило предложенное решение, при этом я конечно учитывал и сложность и требования своей конкретной задачи. 
К чему надо было влазить с рассуждениями о сложности, в уже решённый вопрос. 
Есть соответствующие разделы форума, заведите тему и вперёд...

Надеюсь, я никого не обидел
PM MAIL ICQ   Вверх
Karadul
Дата 27.3.2012, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(knopka @  26.3.2012,  23:49 Найти цитируемый пост)
я не учитель, что бы бесплатно палочки перекладывать

Я не учитель, чтобы учить складывать 2+2. У меня не работал эклипс, чтобы проверить код, а заменить метод на нужный - задача, с которой можно не справиться только при нежелании. Поэтому я и сказал, что здесь не бесплатный цирк, и для того, чтобы тебе помогли, стоит самому приложить какие-то усилия.

По поводу нужности замены, претензии не столько к тебе, сколько к остальным, что их поиск в неоптимальной структуре нисколько не смущал. Кстати, а вам такие мелочи не преподают? Нам преподавали smile

Цитата(knopka @  26.3.2012,  23:49 Найти цитируемый пост)
5 лет преподавания в ВУЗе предмета "Структуры и алгоритмы обработки данных" позволяют мне это утверждать. 

Ого! 5 лет преподавания - и сами хреначим поиск в списке? Это как безопасник, который ставит пароль 123 на доступный в инете сервер smile А потом отвечает "я же безопасник, все под контролем, не лезьте, без вас разберутся".

Как у автора темы, можно спросить: а почему все-таки List, а не что-то другое? Знания явы не позволили? Так посоветовали же LinkedHashSet. Или просто по барабану? Без претензий, просто интересно.
Про ожидаемый размер списка и частоту поиска в нем в теме не было ни слова.

А к чему влазить... ну если структуры с неподходящим классом сложности тут никого не смущают - может валить отсюда, как поросенок Петр? Меня просто возмутило то, что на такие "мелочи" никто не обращает внимание, и понеслось.
PM MAIL   Вверх
Mirkes
Дата 27.3.2012, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @  27.3.2012,  00:36 Найти цитируемый пост)
А к чему влазить... ну если структуры с неподходящим классом сложности тут никого не смущают - может валить отсюда, как поросенок Петр? Меня просто возмутило то, что на такие "мелочи" никто не обращает внимание, и понеслось. 


Предельно не внимательно. Читаем третий пост от начала темы.
Я таки окончательно выхожу из дискуссии, поскольку по содержанию и даже по теории сказано уже все.


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


Опытный
**


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

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



Цитата(Mirkes @  27.3.2012,  03:52 Найти цитируемый пост)
Предельно не внимательно. Читаем третий пост от начала темы.

Ув. Mirkes, не надо в меня тыкать постом, на который я в своих предыдущих постах не раз обращал внимание форумчан. Но там нет ни слова про класс сложности как причину выбора, да и на пост, кроме меня, никто не обратил внимания. Все танцы шли вокруг поиска в списке.
PM MAIL   Вверх
sergioK1
Дата 27.3.2012, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @ 27.3.2012,  11:52)
Цитата(Mirkes @  27.3.2012,  03:52 Найти цитируемый пост)
Предельно не внимательно. Читаем третий пост от начала темы.

Ув. Mirkes, не надо в меня тыкать постом, на который я в своих предыдущих постах не раз обращал внимание форумчан. Но там нет ни слова про класс сложности как причину выбора, да и на пост, кроме меня, никто не обратил внимания. Все танцы шли вокруг поиска в списке.

Граждане тема о чем ? ,  
запутался немного  smile 


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


Опытный
**


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

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



Цитата(Karadul @  27.3.2012,  12:52 Найти цитируемый пост)
Но там нет ни слова про класс сложности как причину выбора.

НУ вот Вы доколупались до причины выбора! Ну, хочется так человеку!
Цитата(knopka @  26.3.2012,  23:49 Найти цитируемый пост)
Позволю себе как автору изложить своё видение вопроса.

Вот этот пост здорово улыбнул! Отличная ирония, можно при случае воспользуюсь без ссылки на авторство? smile
З. Ы.
Цитата(sergioK1 @  27.3.2012,  15:53 Найти цитируемый пост)
Граждане тема о чем ? ,

Походу, уже ни о чём, но читать интересно! smile

Добавлено через 2 минуты и 42 секунды
to Karadul Вы тоже очень смешной человек! Пытаетесь всем доказать, что Вы не верблюд, и, на мой взгляд, преуспели в этом: Вы гораздо упрямее! smile


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 28.3.2012, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну и хрен с вами, похоже, класс сложности тут никого не интересует в принципе. Надеюсь, мне с программами, написанными вами подобными сталкиваться не придется.
PM MAIL   Вверх
sergioK1
Дата 28.3.2012, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @ 28.3.2012,  01:04)
Ну и хрен с вами, похоже, класс сложности тут никого не интересует в принципе. Надеюсь, мне с программами, написанными вами подобными сталкиваться не придется.

похоже ты форумом ошибся , 
PM MAIL   Вверх
LSD
Дата 28.3.2012, 12:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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




M
LSD
Поскольку Karadul так и не прекратил хамить, да еще и не смог привести никакого удовлетворительного решения задачи, он отправляется в баню на неделю.


Proof of concept решения с List<String> и временем порядка O(log(n)):
Код

import org.apache.commons.collections.list.TreeList;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class NamesGenTest {
    @SuppressWarnings("unchecked")
    private List<String> names = new TreeList();

    public NamesGenTest(String... names) {
        Arrays.sort(names);
        this.names.addAll(Arrays.asList(names));
    }

    public String generateName(final String name) {
        int i = Collections.binarySearch(names, name);
        if (i < 0) {
            names.add(-i - 1, name);
            return name;
        } else {
            return generateNewName(name, i);
        }
    }

    private String generateNewName(final String oldName, final int index) {
        final int namesSize = names.size();
        int counter = 1;
        int pos = index;
        while (pos < namesSize) {
            String newName = oldName + counter;
            int compare = newName.compareTo(names.get(pos));
            if (compare == 0) {
                counter++;
                pos++;
            } else if (compare < 0) {
                names.add(pos, newName);
                return newName;
            } else {
                pos++;
            }
        }
        String newName = oldName + counter;
        names.add(pos, newName);
        return newName;
    }

    public static void main(String[] args) {
        NamesGenTest test = new NamesGenTest("aaa", "abc", "abc!", "abc1", "abc2", "abc4", "cde");
        System.out.println("Initial list: " + test.names);
        String generatedName = test.generateName("abc");
        System.out.println("Generated name: " + generatedName);
        System.out.println("Modified list: " + test.names);
    }
}



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

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

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


 




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


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

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