【问题标题】:Java - How to store most recent strings from input stream?Java - 如何存储输入流中的最新字符串?
【发布时间】:2013-11-02 13:48:30
【问题描述】:

我有一个输入流,它每 1 秒为我提供一个新字符串。我想存储 25 个最近的字符串以便随时访问。我在 Java 中工作,不想使用公共库之外的任何东西。我更愿意为此实现创建一个单独的类。

举个例子:

String a = "string a";
String b = "string b";
String c = "string c";
...

storedStrings[0] = c;
storedStrings[1] = b;
storedStrings[2] = a;

当 String d = "string d" 到达时,我希望 storedStrings 像这样移动:

storedStrings[0] = d;
storedStrings[1] = c;
storedStrings[2] = b;
storedStrings[3] = a;

在我加载了 25 个字符串之后,我不再关心 String a 的值,它应该被丢弃以免占用内存。我试过 ArrayList 并没有成功。这是 Vector 的用例吗?

请指出正确的方向!

使用 LinkedList 更新我实施的解决方案:

public static void addToQueue(String s){
         if (list == null) list = new LinkedList<>();
           list.addFirst(s);
           System.out.println(s);
           if (list.size() > 25) {
           list.removeLast();
           }
}

【问题讨论】:

    标签: java string arraylist inputstream


    【解决方案1】:

    您可以使用 arraylist.add(0,element)。这将在第一个位置添加一个新元素,并将列表中的所有元素向右移动一个位置。如果您已经有 25 个元素,那么您只需删除最后一个元素。

        if(ArrayList.size()>=25){
            ArrayList.remove(ArrayList.size()-1);
        }
        ArrayList.add(0,d);
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用 LinkedList

      LinkedList<String> array = new LinkedList<>();
      for (int i = 0; i < 30; i++) {
          array.add(Integer.toString(i));
      }
      array.removeFirst();
      for (String s : array) {
          System.out.println(s);
      }
      

      使用队列:

      public static void main(String[] args) {
          AbstractQueue<String> array = new ArrayBlockingQueue<String>(25);
          for (int i = 0; i < 30; i++) {          
              if (array.size() >= 25)
                  array.remove();
              array.add(Integer.toString(i));
          }
          for (String s : array) {
              System.out.println(s);
          }
      }
      

      【讨论】:

        【解决方案3】:

        使用链表可以很容易地完成:

           LinkedList<String> list = new LinkedList<>();
           list.addFirst("your new string");
           list.removeLast();
        

        或者只是通过以下方式扩展 List 的任何东西(这也适用于 ArrayList):

           List<String> list = new LinkedList<>();
           list.add(0,"your new string");
           list.remove(list.size()-1);
        

        或者你可以使用队列

            Queue<String> que = new LinkedList<>();
            que.add("your new string");
            que.remove();
        

        【讨论】:

        • 您应该检查示例中的大小。仅当列表/队列大小大于 25 时才删除
        • 填好这不是问题作者的问题,他想知道之后该怎么做......所以我做了几个尽可能简单的例子以便于阅读。
        • 很多非常有用的答案!谢谢,libik 的 LinkedList 建议。这是一个有效且简单的实现。
        【解决方案4】:

        一个想法是使用Queue

        1. 检查大小
        2. 如果小于最大值,则入队,如果在最大值,则出队,然后将下一个元素入队
        3. ???
        4. 利润

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-29
          • 1970-01-01
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          相关资源
          最近更新 更多