Java - 如何从输入流中存储最新的字符串?

时间:2013-10-24 02:47:55

标签: java string arraylist inputstream

我有一个输入流,每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个字符串后,我不再关心字符串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();
           }
}

4 个答案:

答案 0 :(得分:2)

使用链表可以非常轻松地完成:

   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();

答案 1 :(得分:1)

一个想法是使用Queue

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您可以尝试使用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);
    }
}