为什么Vector(ArrayList for Java people)的经典实现在每次扩展时将其内部数组大小加倍,而不是将其增加三倍或四倍?
我正在研究一个使用ArrayList存储的程序Strings.程序通过菜单提示用户,并允许用户选择要执行的操作.这样的操作是将字符串添加到列表,打印条目等.我想要做的是创建一个名为的方法removeDuplicates().此方法将搜索ArrayList并删除任何重复的值.我想在列表中留下一个重复值的实例.我还希望此方法返回已删除的重复项的总数.
我一直在尝试使用嵌套循环来实现这一点,但是我遇到了麻烦,因为当条目被删除时,变量的索引ArrayList会被改变,并且事情不能正常工作.我从概念上知道我需要做什么但是我在代码中实现这个想法时遇到了麻烦.
这是一些伪代码:
从第一次入门开始; 检查列表中的每个后续条目,看它是否与第一个条目匹配; 删除列表中与第一个条目匹配的每个后续条目;
在检查完所有条目后,转到第二个条目; 检查列表中的每个条目,看它是否与第二个条目匹配; 删除列表中与第二个条目匹配的每个条目;
重复列表中的条目
这是我到目前为止的代码:
public int removeDuplicates()
{
int duplicates = 0;
for ( int i = 0; i < strings.size(); i++ )
{
for ( int j = 0; j < strings.size(); j++ )
{
if ( i == j )
{
// i & j refer to same entry so do nothing
}
else if ( strings.get( j ).equals( strings.get( i …Run Code Online (Sandbox Code Playgroud) 我想知道,size()你可以调用现有ArrayList<T>缓存的方法吗?或者在性能关键代码中,我只是将其存储size()在本地int中?
当你不在调用之间添加/删除项目时,我希望它确实被缓存size().
我对吗?
更新
我不是在谈论内联或类似的事情.我只是想知道方法size()本身是否在内部缓存值,或者它是否每次调用时都会动态计算.
我是java编程的新手,在php中编程所以我习惯了这种类型的循环:
int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
mapOverlays.remove(n);
}
Run Code Online (Sandbox Code Playgroud)
所以我想删除除第一项之外的所有内容,为什么这不起作用呢?我得到它,删除后,数组键是否重新排列?
可能重复:
数组的好处
嘿,
有什么理由喜欢Arrays (MyObject[])过ArrayLists (List<MyObject>)?使用Arrays的唯一剩下的地方是原始数据类型(int,boolean等).但是我对此没有合理的解释,只是让代码变得更加苗条.
一般来说,我使用List来保持更好的灵活性.但是有没有理由使用真正的阵列?
我想知道,最好的问候
我有一个ArrayList,我动态地添加了一些对象,我有一个JButton.运行我的程序时,ArrayList为空,JButton设置为setEnabled(false).我想在ArrayList中有2个元素时启用我的按钮,如果ArrayList有一个项目或为空,则再次禁用它.我怎样才能做到这一点?
我有一个ArrayList我在之间传递activities.在这里ArrayList,由一个class有四个变量的对象组成.其中的一个变量是另一种ArrayList<object>是从另一个class.
我已经实现Parcelable上都和我敢肯定我已经正确地完成了parcelable方法.以下是错误:
错误:
03-18 02:37:27.063: D/dalvikvm(3249): GC_FOR_ALLOC freed 82K, 6% free 3020K/3180K, paused 1ms, total 3ms
03-18 02:37:27.093: I/dalvikvm-heap(3249): Grow heap (frag case) to 3.626MB for 635808-byte allocation
03-18 02:37:27.103: D/dalvikvm(3249): GC_FOR_ALLOC freed 5K, 5% free 3635K/3804K, paused 10ms, total 10ms
03-18 02:37:27.173: D/(3249): HostConnection::get() New Host Connection established 0xb96396c0, tid 3249
03-18 02:37:27.243: W/EGL_emulation(3249): eglSurfaceAttrib not implemented
03-18 02:37:27.253: D/OpenGLRenderer(3249): Enabling debug mode 0
03-18 …Run Code Online (Sandbox Code Playgroud) 我需要一个类似ArrayList的结构,只允许以下操作
get(int index)add(E element)set(int index, E element)iterator()由于迭代器在许多地方使用,使用Collections#synchronizedList太容易出错.该列表可以增长到几千个元素并且会被大量使用,所以我很确定,这CopyOnWriteArrayList将太慢了.我会从它开始,以避免过早的优化,但我敢打赌它不会很好.
大多数访问将是单线程读取.所以我问这是什么样的数据结构.
我虽然包装synchronizedList提供同步迭代器的东西会做,但它不会因为ConcurrentModificationException.对于并发行为,我显然需要后续读取和迭代器可以看到所有更改.
迭代器不必显示一致的快照,它可能会也可能不会看到更新,set(int index, E element)因为此操作仅用于替换具有更新版本的项目(包含一些添加的信息,这与迭代器的用户无关) ).这些项目完全不可变.
我清楚地说明了为什么CopyOnWriteArrayList不这样做.ConcurrentLinkedQueue由于缺乏索引访问权限,因此是不可能的.我只需要几个操作而不是完全成熟ArrayList.因此,除非任何与Java并发列表相关的问题与此问题重复,否则这个问题不是.
我有一个空的数组列表:
var mylist: ArrayList<Int> = ArrayList()
Run Code Online (Sandbox Code Playgroud)
当我想在其中设置值时,我收到此错误:
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
Run Code Online (Sandbox Code Playgroud)
问题是:我如何初始化我的清单?
我有ArrayList以下字符串;
List<String> e = new ArrayList<String>();
e.add("123");
e.add("122");
e.add("125");
e.add("123");
Run Code Online (Sandbox Code Playgroud)
我想检查列表中的重复项并将其从列表中删除.在这种情况下,我的列表将只有两个值,在这个例子中,它将是值122和125,并且两个123将消失.
最好的方法是什么?我正在考虑使用a Set,但这只会删除其中一个副本.