2017-01-09 4 views
1

Sample.javaПовторяющиеся значения в списке <String> в конструкторе Java

public class Sample { 


static List<Object> list1 = new ArrayList<Object>(); 
static List<String> list = new ArrayList<String>(); 

private String value; 

private String type; 

static List<String> types = new ArrayList<String>(); 

public Item() throws ParseException { 
    JsontoList j = new JsontoList(); 
    // types = Arrays.asList("green", "yellow", "red"); 
    array = j.getarray(); 
    list1 = j.toList(array); 
    list = j.getList(array); 
    types=list; 

} 

public List<String> getTypes() { 
    return types; 
} 

//public void setTypes(List<String> types) { 
    //this.types = types; 
//} 

С выше code..I могу успешно отобразить Bootsfaces table.On щелчок Добавить CommandButton .. TextFields и В каждом столбце по очереди добавляются выпадающие окна, а входные значения сохраняются в JSON. Но проблема в том, что..Whenever ADD нажимается .. вместе с TextField и Dropdown .. значения Dropdown из базы данных также становятся добавленными каждый раз, приводя к множеству значений.

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

Пожалуйста, предложите любой другой подход. Любая помощь будет оценена. Спасибо заранее.

+1

Чтобы получить правильные ответы/подсказки, я настоятельно рекомендую пересмотреть вопрос, чтобы показать [mcve] в форме простого Java-приложения с использованием метода 'main()'. А именно, это вовсе не проблема [jsf] [bootsfaces], а просто базовая [java]. – BalusC

+0

Я пытаюсь запустить ваш пример на полчаса - безрезультатно. Что мне нужно для компиляции исходных кодов? Какие библиотеки вы используете? И что такое тег ''? –

ответ

1

Я получил решение, и это worked-

В Item.java

public Item() throws ParseException { 
JsontoList j = new JsontoList(); 
array = j.getarray(); 
list1 = j.toList(array); 
list = j.getList(array); 

List<String> types = new ArrayList<String>(); 
types = list; 

//Added this piece of code below 

Set<String> hs = new HashSet<>(); 
// add elements to List types, including duplicates 
hs.addAll(types); 
types.clear(); 
types.addAll(hs); 
} 

Для удаления дубликатов в коллекции мы должны рассмотреть, почему мы используем Coll который позволяет дублировать. Самый простой способ удалить повторяющиеся элементы - это добавить содержимое в Set (который не позволит дублировать), а затем добавить Set обратно в ArrayList.

+0

Это будет работать, пока вы не отправите заявку. Как только многие пользователи будут работать с вашим приложением, вы заметите всевозможные странные ошибки. Например, 'types.addAll()' занимает некоторое время. Если кто-то еще читает переменную точно в одно и то же время, они будут видеть только часть ожидаемых значений. –

0

Я могу только догадываться (потому что я не знаю, как скомпилировать исходные коды), но есть очень подозрительная строка. Посмотрите на метод @PostConstructItem. Он инициализирует переменную переменную types снова и снова. Вероятно, это строка, где считывается база данных, и результат добавляется к уже существующему массиву types.

Как правило, я рекомендую быть очень осторожным при использовании статических переменных. Их нужно инициализировать только один раз. Фактически, инициализация статических переменных несколько раз может вызвать все типы странных ошибок. Вы должны иметь в виду, что приложения JSF всегда используются многими пользователями. Другими словами, существует много потоков, обращающихся к одной и только статической переменной. Что произойдет, если пользователь А изменяет статическую переменную, которую пользователь B только что прочитал секунду раньше? Минимальная защита - это блок synchronized вместе с проверкой того, была ли переменная уже инициализирована.

Update 10 января 2017: В результате исходный код выглядит примерно так:

public class Item { 
    private static List<String> types = null; 

    public Item() throws ParseException { 
    synchronized(types) { 
     if (null==types) { 
     JsontoList j = new JsontoList(); 
     String array = j.getarray(); 
     types = j.getList(array); 
     } 
    } 
    } 
} 
+0

Thankyou ... Но можете ли вы объяснить программным способом. Могу ли я инициализировать ** типы ** в ** Item ** только один раз без повторения? – Spandana

+0

Готово. См. Выше. –

+0

Спасибо за объяснение .. :-) Но значения не загружаются в раскрывающийся список этим процессом. – Spandana

Смежные вопросы