【问题标题】:Java: Add to Stack from SetJava:从集合添加到堆栈
【发布时间】:2016-11-14 00:32:09
【问题描述】:

我遇到的问题是我正在从文件中读取数据(很好)到程序中并将数据安排到堆栈中(也很好)但是我在尝试解决如何避免输入任何重复数据时遇到问题进入堆栈。

我四处询问并被建议使用一个集合,我有,但我不知道如何将数据从集合中取出并放入堆栈

    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++;
            }
        }

这是我目前拥有的代码(减去所有问号),如果有人能指出我可能出错的地方,我将不胜感激

【问题讨论】:

  • 您对堆栈大小有什么要求(即为什么要检查计数)?您可以简单地在循环中填充 Set 并在循环结束后将其添加到堆栈中。

标签: java list stack set


【解决方案1】:

堆栈从Vector继承contains(Object o)函数: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); }
    }

或者,如果仅当元素既不在 stack1 也不在 stack2 中时,您才将元素放入 stack2,那么您应该重写第二个 if 语句中的谓词。

【讨论】:

    【解决方案2】:

    在继续之前,使用Stack 是绝对必要的吗?这个类的 Javadoc 说:“Deque 接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应该优先使用它而不是这个类。”

    另外,使用StringTokenizer也需要吗?该类的 Javadoc 说:“StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 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++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-03
      • 2016-11-02
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多