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

Поиск:

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

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

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


 




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


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

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