【问题标题】:Make my own FIFO Queue class for my own class object to fill it?为我自己的类对象制作我自己的FIFO Queue类来填充它?
【发布时间】:2010-10-05 19:13:19
【问题描述】:

我正在尝试创建一个填充了我自己的类对象的 FIFO 队列。
我找到了这个例子,但是如果我用 替换 它将不起作用:

import java.util.LinkedList;


public class SimpleQueue<E> {

private LinkedList<E> list = new LinkedList<E>();


 public void put(E o) {
    list.addLast(o);
     }


  public E get() {
     if (list.isEmpty()) {
          return null;
      }
   return list.removeFirst();
   }


   public Object[] getAll() {
     Object[] res = new Object[list.size()];
    for (int i = 0; i < res.length; i++) {
      res[i] = list.get(i);
      }
   list.clear();
    return res;
 }



    public E peek() {
      return list.getFirst();
      }


  public boolean isEmpty() {
     return list.isEmpty();
    }


  public int size() {
    return list.size();
    }
  }

【问题讨论】:

  • 泛型应该是“通用的”。想要将类型变量名称更改为 PCB 会使您看起来好像有一个特定的类型作为参数。无论如何,您可能只是在进行搜索和替换时创建了一个类型;使用“PCB”在语法上没有任何问题,只是看起来很难看。
  • 如何将E 替换为PCB
  • “它不起作用”。什么不起作用?它不会编译吗?
  • 如果它没有编译,错误信息是什么以及代码中的哪里出现了错误。如果它编译你看到什么行为?如果不向我们提供必要的信息,我们将无法真正帮助您解决问题。我建议阅读catb.org/esr/faqs/smart-questions.html 作为如何提问的参考。

标签: java class object queue fifo


【解决方案1】:

E 是一个类型参数。简单来说,您可以将其视为“模板”,可用于创建可容纳特定类实例的队列。

您可以按如下方式创建PCB 对象的队列:

SimpleQueue<PCB> queue = new SimpleQueue<PCB>();

如果您想了解有关 Java 泛型的更多信息,Java Generics FAQs 是一个很好的资源。

【讨论】:

  • @Luron:你说“......如果我用 替换 ...”我认为你实际上在 Java 中用 &lt;PCB&gt; 替换了 &lt;E&gt; SimpleQueue 的来源。如果您在我的回答中实例化了SimpleQueue,为什么它不起作用?我已经尝试过了,它似乎可以工作(putget 似乎工作正常,但我可能遗漏了一些东西)。您是否有编译错误或堆栈跟踪?
  • @Luron:对不起,我不明白。我已将您的 SimpleQueue 类复制到一个新的 Java 源文件中,并且它编译得很好。我也可以实例化它,如我的答案所示。你有什么问题?编译错误?
  • @Luron:那么错误是什么?您是否收到编译器错误消息?运行时会报错吗?代码看起来是有效的,如果 Richard 说他运行了它并且它可以工作,那么问题并不明显。您需要向我们提供有关该问题的更多信息,而不仅仅是“它不起作用”。
【解决方案2】:
public class MyQueue{

    int arr[]=new int[10];
    int i=0;
    int j=0;
    public void inn(int a)
    {
        System.out.println("You hava entered :"+a);
        arr[i]=a;
        i=i+1;
    }
    public int out()
    {
        return arr[j++];

    }
    public static void main(String args[])
    {
        MyQueue q=new MyQueue();
        q.inn(4);
        q.inn(3);
        q.inn(46);
        q.inn(44);
        q.inn(43);
        System.out.println(q.out());
        System.out.println(q.out());
        System.out.println(q.out());
        System.out.println(q.out());
    }
}

【讨论】:

    【解决方案3】:

    太阳的通用教程如下:

    我们建议您使用精髓 (如果可能,单个字符)尚未 正式类型的令人回味的名称 参数。最好避免低于3 这些名称中的大小写字符,使 很容易区分正式类型 来自普通类的参数和 接口。许多容器类型使用 E,对于元素,如示例中所示 以上。

    所以,你把它改成PCB应该不是问题。

    但如果PCB 是您要存储对象的唯一类,则不必创建泛型类。只需从类定义行中删除 &lt;PCB&gt; 并将所有 E 替换为 PCB

    public class SimpleQueue
    {
        LinkedList<PCB> list = new LinkedList<PCB>();
    
        ....
    
        public PCB peek()
        {
            return list.getFist();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多