2016-11-14 2 views
-2

Проблема, связанная с тем, что я читаю данные из файла (прекрасно) в программу и упорядочиваю данные в Stacks (также отлично), но у меня возникают проблемы, поскольку Im пытается выяснить, как чтобы избежать дублирования данных в стек (ы).Java: Добавить в стек из набора

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

Stack<String> stack1 = new Stack<String>(); 
    Stack<String> stack2 = new Stack<String>(); 
    Set<String> duplicateCheck = new HashSet<String>(); 



    try 
    { 
     //Read file 
     File myFile = new File("TestData.txt"); 
     FileReader fr = new FileReader(myFile); 
     BufferedReader br = new BufferedReader(fr); 
     String line = null; 
     int count = 0; 
    while((line = br.readLine()) != null) 
     { 
      StringTokenizer st = new StringTokenizer(line,","); 
      while(st.hasMoreElements()) 
      { 
       duplicateCheck.add(st.nextToken()); 

       if(count < 9) 
       { 
        stack1???????????????; 
       } 
       if(count >9 && count <19) 
       { 
        stack2???????????????; 
       } 
       if(count >= 19) 
       { 
        System.out.println("Capacity has been reached"); 
       } 
       count++; 
      } 
     } 

Вот код, который я в настоящее время (минус все вопросительные знаки), и если кто-нибудь может дать некоторые указания относительно того, где я может идти не так, и.т.д высоко ценится

+0

Каковы ваши требования к размерам стека (например, для проверки количества)? Вы можете просто заполнить набор в цикле и добавить его в стек после окончания цикла. –

ответ

2

стек наследует contains(Object o) функцию от Vector: https://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#contains(java.lang.Object)

Итак, что-то, как это должно работать:

String currentToken = st.nextToken(); 
    if(count < 9) { 
     if (! stack1.contains(currentToken)) { stack1.add(currentToken); } 
    } 
    if(count >9 && count <19) { 
     if (! stack2.contains(currentToken)) { stack2.add(currentToken); } 
    } 

Или, если вы хотите поместить элементы stack2 только тогда, когда элемент не в stack1 ни stack2, то вы должны переписать предикат во втором случае утверждение.

1

Перед тем, как идти дальше, является ли абсолютное требование использовать Stack? Javadoc для этого класса говорит: «Более полный и последовательный набор операций стека LIFO обеспечивается интерфейсом Deque и его реализациями, которые следует использовать в предпочтении этому классу».

Кроме того, также необходимо использовать StringTokenizer? Javadoc для этого класса говорит: «StringTokenizer - это унаследованный класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы любой, кто ищет эту функциональность, использовал метод split для String или пакет java.util.regex вместо."

Возможно, вы работаете в очень старой книге, использующей устаревшую версию Java?

Теперь, на ваш вопрос. Вы можете использовать Set, как вы это делаете, для проверки дубликатов. Его метод add возвращает true, если элемент еще не существует и был добавлен в этот вызов, или false, если элемент не был добавлен, поскольку он уже существует. Поэтому вы можете использовать набор следующим образом:

String token = st.nextToken(); 
if (duplicateCheck.add(token)) { 
    if (count < 9) 
     stack1.add(token); 
    else if (count < 19) 
     stack2.add(token); 
    else 
     System.out.println("Capacity has been reached"); 
    count++; 
}