- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为在调整数组大小时出现了问题,但在调整大小后队列未正确排队。这是我已经完成的类(class)。
/**
* ArrayQueue
* Implementation of a queue using
* an array as the backing structure
*
* @author Your Name Here
* @version 1.0
*/
public class ArrayQueue<T> implements QueueADT<T> {
// Do not add instance variables
private T[] backing;
private int size;
private int front;
private int back;
/**
* Construct an ArrayQueue with an
* initial capacity of INITIAL_CAPACITY
*
* Use Constructor Chaining
*/
public ArrayQueue() {
backing = (T[]) new Object[INITIAL_CAPACITY];
size = 0;
front = 0;
back = 0;
}
/**
* Construct an ArrayQueue with the specified
* initial capacity of initialCapacity
* @param initialCapacity Initial capacity of the backing array.
*/
public ArrayQueue(int initialCapacity) {
backing = (T[]) new Object[initialCapacity];
size = 0;
front = 0;
back = 0;
}
@Override
public void enqueue(T data) {
if (data == null) {
throw new IllegalArgumentException("Data is null.");
}
//Resize
if (size >= backing.length) {
T[] backingCopy = (T[]) new Object[backing.length * 2];
for (int i = 0; i < backing.length; i++) {
backingCopy[i] = backing[i];
}
front = 0;
back = backing.length - 1;
backing = backingCopy;
}
backing[back] = data;
back = (back + 1) % backing.length;
size++;
}
@Override
public T dequeue() {
if (isEmpty()) {
throw new java.util.NoSuchElementException("Queue is empty.");
}
T returnData = backing[front];
backing[front] = null;
front = (front + 1) % backing.length;
size--;
return returnData;
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
/**
* Returns the backing array for your queue.
* This is for grading purposes only. DO NOT EDIT THIS METHOD.
*
* @return the backing array
*/
public Object[] getBackingArray() {
return backing;
}
}
当我在调整大小后入队时,它会将一些数字放在前面而不是后面。
最佳答案
您的实现存在一些问题:
A.调整数组大小后,您可以设置:
back = backing.length - 1;
应该是:
back = backing.length;
让我们以容量为1的队列为例:
大小
= 0
,front
= 0
,back
= 0
size
= 1
, front
= 0
, back
> = 1 % 1
= 0
添加另一个元素:size
== backing.length
a.创建 backingCopy
数组
b.将 backing
元素复制到 backingCopy
数组
c. back
= backing.length - 1
= 1 - 1
= 0
d.设置backing
= backingCopy
e. backing[back] = data
(这会覆盖索引 0 处第一个添加的元素)
B.调整数组大小后将 front 设置为 0 似乎是一个问题,除非在复制到 backingCopy 数组时重新排序数据。
<小时/>数组队列:
public class ArrayQueue<T> {
private T[] backing;
private int size;
private int front;
private int back;
public ArrayQueue() {
backing = (T[])new Object[INITIAL_CAPACITY];
size = 0;
front = 0;
back = 0;
}
public ArrayQueue(int initialCapacity) {
backing = (T[]) new Object[initialCapacity];
size = 0;
front = 0;
back = 0;
}
public void enqueue(T data) {
if (data == null) {
throw new IllegalArgumentException("Data is null.");
}
if (size() == backing.length) {
resize();
}
backing[back] = data;
back = (back + 1) % backing.length;
size++;
}
private void resize() {
T[] backingCopy = (T[]) new Object[backing.length == 0 ? 1 : backing.length * 2];
// Insert elements from backing array to backingCopy in order.
System.arraycopy(backing, front, backingCopy, 0, backing.length - front);
System.arraycopy(backing, 0, backingCopy, backing.length - front, back);
front = 0;
back = backing.length;
backing = backingCopy;
}
public T dequeue() {
if (isEmpty()) {
throw new java.util.NoSuchElementException("Queue is empty.");
}
T returnData = backing[front];
backing[front] = null;
front = (front + 1) % backing.length;
size--;
return returnData;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size() == 0;
}
int front() {
return front;
}
int back() {
return back;
}
Object[] getBackingArray() {
return backing;
}
static final int INITIAL_CAPACITY = 100;
}
ArrayQueue测试:
import org.junit.Test;
import java.util.Arrays;
import java.util.NoSuchElementException;
import static org.junit.Assert.*;
public class ArrayQueueTest {
@Test
public void enqueue_withInitialCapacity0() {
// Given an ArrayQueue with initialCapacity 0.
int initialCapacity = 0;
ArrayQueue<Integer> q = new ArrayQueue<Integer>(initialCapacity);
// When enqueue is called.
q.enqueue(0);
// Then ArrayQueue resizes backing array to 1 and adds element.
assertEquals(Arrays.asList(0), Arrays.asList(q.getBackingArray()));
}
@Test
public void enqueue_lessThanCapacity() {
// Given an ArrayQueue with some initialCapacity.
ArrayQueue<Integer> q = new ArrayQueue<Integer>(2);
// When less than capacity elements are enqueued.
q.enqueue(0);
// Then ArrayQueue adds elements to backing array.
assertEquals(Arrays.asList(0, null), Arrays.asList(q.getBackingArray()));
}
@Test
public void enqueue_toCapacity() {
// Given an ArrayQueue with some initialCapacity.
ArrayQueue<Integer> q = new ArrayQueue<Integer>(2);
// When initialCapacity elements are enqueued.
q.enqueue(0);
q.enqueue(1);
// Then ArrayQueue adds elements to backing array.
assertEquals(Arrays.asList(0, 1), Arrays.asList(q.getBackingArray()));
}
@Test
public void enqueue_withResize() {
// Given an ArrayQueue is at capacity.
int initialCapacity = 2;
ArrayQueue<Integer> q = new ArrayQueue<Integer>(initialCapacity);
q.enqueue(0);
q.enqueue(1);
// When enqueue is called again.
q.enqueue(2);
// Then ArrayQueue is capacity is doubled and element is added.
int expectedCapacity = 2 * initialCapacity;
assertEquals(expectedCapacity, q.getBackingArray().length);
assertEquals(Arrays.asList(0, 1, 2, null), Arrays.asList(q.getBackingArray()));
}
@Test(expected = NoSuchElementException.class)
public void dequeue_isEmpty() {
// Given an empty ArrayQueue.
ArrayQueue<Integer> q = new ArrayQueue<Integer>();
// Throws when dequeue is called.
q.dequeue();
fail("Should have thrown NoSuchElementException.");
}
@Test
public void dequeue() {
ArrayQueue<Integer> q = new ArrayQueue<Integer>(4);
q.enqueue(0);
q.enqueue(1);
q.enqueue(2);
assertEquals(3, q.size());
assertEquals(0, q.front());
assertEquals(3, q.back());
assertEquals(Arrays.asList(0, 1, 2, null), Arrays.asList(q.getBackingArray()));
assertEquals(0, (int) q.dequeue());
assertEquals(2, q.size());
assertEquals(1, q.front());
assertEquals(3, q.back());
assertEquals(Arrays.asList(null, 1, 2, null), Arrays.asList(q.getBackingArray()));
assertEquals(1, (int) q.dequeue());
assertEquals(1, q.size());
assertEquals(2, q.front());
assertEquals(3, q.back());
assertEquals(Arrays.asList(null, null, 2, null), Arrays.asList(q.getBackingArray()));
assertEquals(2, (int) q.dequeue());
assertEquals(0, q.size());
assertEquals(3, q.front());
assertEquals(3, q.back());
assertEquals(Arrays.asList(null, null, null, null), Arrays.asList(q.getBackingArray()));
}
@Test
public void loopAround_enqueue() {
// Given an ArrayQueue with elements that have been dequeued.
ArrayQueue<Integer> q = new ArrayQueue<Integer>(4);
q.enqueue(0);
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.dequeue();
q.dequeue();
assertEquals(2, q.size());
assertEquals(2, q.front());
assertEquals(0, q.back());
assertEquals(Arrays.asList(null, null, 2, 3), Arrays.asList(q.getBackingArray()));
// When enqueue is called.
q.enqueue(4);
q.enqueue(5);
// Then resize is not called and elements are added to the front beginning of the array.
assertEquals(4, q.size());
assertEquals(2, q.front());
assertEquals(2, q.back());
assertEquals(Arrays.asList(4, 5, 2, 3), Arrays.asList(q.getBackingArray()));
}
@Test
public void loopAround_enqueue_withResize() {
// Given an ArrayQueue that loops around and is at capacity.
ArrayQueue<Integer> q = new ArrayQueue<Integer>(4);
q.enqueue(0);
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.dequeue();
q.dequeue();
q.enqueue(4);
q.enqueue(5);
assertEquals(Arrays.asList(4, 5, 2, 3), Arrays.asList(q.getBackingArray()));
// When enqueue is called.
q.enqueue(6);
// Then ArrayQueue resizes and reorders the backing array before adding the element.
assertEquals(5, q.size());
assertEquals(0, q.front());
assertEquals(5, q.back());
assertEquals(Arrays.asList(2, 3, 4, 5, 6, null, null, null), Arrays.asList(q.getBackingArray()));
}
@Test
public void loopAround_dequeue() {
ArrayQueue<Integer> q = new ArrayQueue<Integer>(4);
q.enqueue(0);
q.enqueue(1);
q.enqueue(2);
q.dequeue();
q.enqueue(3);
q.enqueue(4);
assertEquals(4, q.size());
assertEquals(1, q.front());
assertEquals(1, q.back());
assertEquals(Arrays.asList(4,1,2,3), Arrays.asList(q.getBackingArray()));
assertEquals(1, (int) q.dequeue());
assertEquals(3, q.size());
assertEquals(2, q.front());
assertEquals(1, q.back());
assertEquals(Arrays.asList(4, null, 2, 3), Arrays.asList(q.getBackingArray()));
assertEquals(2, (int) q.dequeue());
assertEquals(2, q.size());
assertEquals(3, q.front());
assertEquals(1, q.back());
assertEquals(Arrays.asList(4, null, null, 3), Arrays.asList(q.getBackingArray()));
assertEquals(3, (int) q.dequeue());
assertEquals(1, q.size());
assertEquals(0, q.front());
assertEquals(1, q.back());
assertEquals(Arrays.asList(4, null, null, null), Arrays.asList(q.getBackingArray()));
assertEquals(4, (int) q.dequeue());
assertEquals(0, q.size());
assertEquals(1, q.front());
assertEquals(1, q.back());
assertEquals(Arrays.asList(null, null, null, null), Arrays.asList(q.getBackingArray()));
}
}
关于java - 循环数组支持的队列: enqueues at wrong offset after resizing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157629/
我有一个 View ,不是窗口的大小,也不是窗口本身,当它调整大小时,我想比较调整大小的开始值和结束值。然而,JQ-UI 的 resize ui 对象只包含以前的状态,而不是原始状态,所以它只是按像素
我有一个简单的可调整大小 jQueryUI 元素。 element.resizable({ start: function(event, ui) {...}, resize: func
我有几个嵌套的可调整大小的 div,需要调整大小以适应子大小。一切正常,直到我尝试调整其中一个外部 div 的大小(垂直)然后它卡住了。 这是一个 fiddle . $(function () { $
CNN 模型将大小为 (112x112) 的图像张量作为输入,并给出 (1x512) 大小的张量作为输出。 使用 Opencv 函数 cv2.resize() 或在 pytorch 中使用 Trans
经过大量搜索和研究,我找不到任何答案。 我将非常感谢可以帮助我的人。 在 SWT Java 中, 我希望我的窗口不能调整大小,所以我这样定义它: shell = new Shell(SWT.CLOSE
$(window).bind('resize') 和 $(window).resize() 有什么区别? 我看到bind嵌套在resize之上。它有什么影响?请参阅下面的代码。 我知道.resize(
使用 Vaadin 14.1.19 和 Vaadin“我的入门元素”元素,我尝试创建一个多行 TextArea。乍一看它工作正常,但是当调整 TextArea 大小时,它不会调整行数。这是我的代码:
我有一个使用 Ext.js 的侧面板。在浏览器调整大小之前,侧面板中的其中一个面板很好。浏览器调整大小时,它会切断面板的组件。 如何在浏览器调整大小时调整面板大小? { xtype:
我需要一种可靠的方法来检测 $(window).on('resize') 是否已由用户交互或 jQuery .trigger 调用触发。 我尝试了以下方法,但我似乎没有在函数调用中取回参数: $(wi
我有一个可调整大小的 div,现在我想在调整此框大小/用户完成调整大小时编辑 cookie。 (我有cookie插件) 我该怎么做? PS:我有多个具有不同 id 的 .div。 我的代码不起作用
这些游标类型有什么区别?我在 Chrome/windows 中看到了所有 3 个相同的光标 .e-resize {cursor: e-resize;} .ew-resize {cursor: ew-r
我使用了一个指令,它调用了一个返回一些值的方法,该方法运行良好。但我的问题是它反复调用它,而我想要的是它应该只在调整大小完成时调用该方法。我采取了这种代码形式 https://codepen.io/f
为了检查这种意外行为,我只是将 TextArea 直接放入 PrimaryStage 包含的 Scene 中:在应用程序启动时,TextArea 完全适合窗口(正如预期的那样)。 但是如果我移动窗口的
我在我的项目中使用 jquery-ui-resizable 插件。 默认情况下,当您制作 DOM 对象 jquery-ui-resizable 时,可调整大小的句柄将出现在右下角,我需要在左下角显示可
我正在 MonoTouch 中使用来自 AV Foundation 的 AVPlayer API 开发视频播放器(但 objective-c 中的解决方案也可能不错)。我正在尝试实现全屏模式。 为了显
我只是想让我的响应式 div 示例像这里一样工作 http://voormedia.com/blog/2012/11/responsive-background-images-with-fixed-o
我正在制作一个包含一个 .html 文件和一个 .css 文件的页面。 我已将 bootstrap 4 CDN 合并到我的 html 头中。 网格在中等屏幕尺寸下显示正确,但在我的手机上查看时它没有调
所以我有一个最近出现的非常具体的问题(就在我们计划的明天发布日之前),我不确定如何解决它。我用我有限的前端技能构建了我们的 HTML 模板网站,我们对此非常满意。但是,我似乎无法解决这个问题。 问题:
据我了解,有类instance.method(parameters)=class.method(instance,parameters),所以只是记法上的区别。但是 np.resize(ndarray
window.resize() 和 window.on('resize' , function()) 有什么区别在 jquery 中? 最佳答案 来自 jQuery页面.resize(): This
我是一名优秀的程序员,十分优秀!