【问题标题】:CircularFifoQueue doesn't work inside the method, what to use instead?CircularFifoQueue 在方法内部不起作用,改用什么?
【发布时间】:2017-10-01 08:59:50
【问题描述】:

我需要编写一个方法来存储最后 10 个(newset)元素,并且只有 10 个。我尝试使用 CircularFifoBuffer。它可以像这样完美地使用:

 import java.util.ArrayList;
 import java.util.List;
 import java.util.Queue;
 import org.apache.commons.collections4.queue.CircularFifoQueue;

 public class Main {

public static void main(String[] args) {

    Queue<Integer> fifo = new CircularFifoQueue<Integer>(3);
    fifo.add(11);
    fifo.add(22);
    fifo.add(33);
    fifo.add(44);
    fifo.add(55);
    System.out.println(fifo); // [33, 44, 55]

但在方法内部使用时不起作用:

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import org.apache.commons.collections4.queue.CircularFifoQueue;

public class TV {

   public int channelNumber = 11;

   public int getChannelNumber() {
      return channelNumber;
   }

   public void addToChannelsHistory(int channnelNumber) {
      Queue<Integer> fifo = new CircularFifoQueue<Integer>(3);
      fifo.add(channnelNumber);
      System.out.print(fifo);
   }
}

你能帮忙改用什么吗?

【问题讨论】:

    标签: java queue fifo circular-buffer


    【解决方案1】:

    你必须使用属性的概念,你的类的成员是一个数据,而不是一个方法:

    public class TV {
    
       private final Queue<Integer> fifo = new CircularFifoQueue<Integer>(3);
    
       public Queue<Integer> getChannelNumbers() {
          return fifo;
       }
    
       public Integer getChannelNumber() {
          return fifo.isEmpty() ? null : fifo.peek();
       }
    
       public void addToChannelsHistory(int channnelNumber) {
          fifo.add(channnelNumber);
       }
    
       public String toString() {
          return fifo.toString();
       }
    
       public static void main( String[] args ) {
          TV tv = new TV();
          tv.addToChannelsHistory(11);
          tv.addToChannelsHistory(22);
          tv.addToChannelsHistory(33);
          tv.addToChannelsHistory(44);
          tv.addToChannelsHistory(55);
          System.out.print( tv );
       }
    }
    

    【讨论】:

      【解决方案2】:

      如果我误解了,请原谅我,但据我所知,通过在本地复制它,这是可行的。但是,在 Java 程序中,main 方法是程序的入口点。如果您没有在 main 方法中实例化您的 TV 类,那么 addToChannelHistory 方法将永远不会运行。例如,这对我有用:

      public class TV {
      
          public int channelNumber = 11;
      
          public int getChannelNumber() {
              return channelNumber;
          }
      
          public void addToChannelsHistory(int channnelNumber) {
      
              Queue<Integer> fifo = new CircularFifoQueue<Integer>(3);
              fifo.add(channnelNumber);
      
              System.out.print(fifo);
          }
      
          public static void main(String[] args) {
              TV tv = new TV();
              tv.addToChannelsHistory(11);
              tv.addToChannelsHistory(22);
              tv.addToChannelsHistory(33);
              tv.addToChannelsHistory(44);
              tv.addToChannelsHistory(55);
          }
      }
      

      运行该程序应将 33 打印到控制台。

      【讨论】:

      • 对不起,我错误地编辑了您的帖子。我不知道如何撤消。
      • 抱歉,我的代码不清楚。显然,我在 main 方法中使用了 tv 对象,并且在对象上调用了该方法。它没有开始打印表格 33
      • 好吧,我不确定。但是上面的代码为我打印了 33 。你能显示你正在使用的确切代码吗?假设@Aubin 的回答也没有帮助?
      • 公共类电视 { public int channelNumber = 11; public int getChannelNumber() { return channelNumber; } public void addToChannelsHistory(int channnelNumber) { Queue fifo = new CircularFifoQueue(3); fifo.add(频道号); System.out.print(fifo); } public static void main(String[] args) { TV tv = new TV(); tv.addToChannelsHistory(11); tv.addToChannelsHistory(22); tv.addToChannelsHistory(33); tv.addToChannelsHistory(44); tv.addToChannelsHistory(55); } }
      • 啊,好吧,我误解了这个问题。我以为你没有让它打印任何东西。我没有意识到这是印刷开始的地方。我的错。查看@Aubin 的答案。那将解决问题。在您的代码中,每次运行该方法时都会创建一个新队列,因此您永远不会填充 3 的大小。
      猜你喜欢
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 2023-03-03
      • 1970-01-01
      • 2023-01-16
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多