遇到一个数组问题,大家帮忙看一下! 我的问题是:我有一个数组A,可能里面的内容很多,假设有1000的长度。我现在希望取他第100个开始,后面的全部内容。我知道用新建另一个数组B来做会比较方便,但是我的A内容实在太多了,如果在看几乎同样大的B很可能会出现内存不足的错误。所以我希望是用数组A来完成这个种操作,不知道大家可有办法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 "我现在希望取他第100个开始,后面的全部内容。"你把下标为100的数组的值放到下标为0的位置,以此类推不就可以了吗?在vb里有redim可以很巧妙的解决。在java里我觉得你还是把值放在list之类的集合类里面,然后把你不需要的下标对应的值从list里面删掉就可以了。不知道能否满足楼主的需求阿? 啊,楼上的说的有点复杂了,JAVA中又没有指针的操作。有没有更直接一些的办法呢? 你用ArrayList比较方便吧。 也可以把最后100条数据截取掉。 否则你就干脆使用链表,Java中虽然没有指针的概念,但是用引用更安全,同样可以使用链表。要是你懒得自己写链表结构,可以使用java.util包中的LinkedList类。 不建议使用链表是因为链表中只能存对象,如果要存字符的话,还要先包装为Character对象,每个字符都要包装一个对象,这样的内存消耗更加大。即使自己做链表结构,也要为每一个链表单元节点保存一个引用,这个引用就已经比字符本身占用的空间更大了,呵呵 可以做到这样:在VB里使用的是安全数组,它定义了一个结构,其中包含了数组的大小,起始地址等等,你只需要将数组的起始地址改成你想要开始的那个数组元素就可以了.但是很抱歉,我没有写过这样的程序,无法给你例子.你可以在网上查找一下: VB指针 这个关键字(好像还有什么葵花宝典的字眼), 好像就是出自CSDN的一篇非常经典的文章,专门讲在VB里如何使用指针来做一些事的. 看错了,这里不是VB区阿,呵呵.JAVA里是不是也没有指针阿???要是有的话就好办了,呵呵 这么加:char[] str = ......;int s = 0;int end = str.length;……运算……然后,你在使用这个数组的时候,就取数组中s和end之间的使用就行了啊 for(int i=99;i<A.length;i++) A[i]....Over! 非常感谢楼上的几位。我之所以希望能截取是因为我要传回这个字符数组,如果按boltzjf的做法,那我还必须传回结束的长度位置了。这样就比较麻烦了。 是的,不过看样子目前能作的只有这些了。那还是新建一个数组拷贝后返回吧……Java中没有可变数组…… 帮你写了一个包装的类import java.util.Iterator;public class CharList implements Iterable<Character> { private char[] charArray = null; private int fromIndex; private int toIndex; public CharList(char[] charArray) { this(charArray, 0, charArray.length - 1); } public CharList(char[] charArray, int fromIndex, int toIndex) { if (fromIndex < 0) { throw new ArrayIndexOutOfBoundsException("fromIndex < 0"); } if (toIndex > charArray.length - 1) { throw new ArrayIndexOutOfBoundsException("toIndex > " + (charArray.length - 1)); } this.charArray = charArray; this.fromIndex = fromIndex; this.toIndex = toIndex; } public int length() { return toIndex - fromIndex + 1; } public char getCharAt(int index) { return charArray[index + fromIndex]; } public void setCharAt(int index, char c) { charArray[index + fromIndex] = c; } public CharList subList(int fromIndex, int toIndex) { if (fromIndex < 0) { throw new ArrayIndexOutOfBoundsException("fromIndex < 0"); } if (toIndex > length() - 1) { throw new ArrayIndexOutOfBoundsException("toIndex > " + (length() - 1)); } return new CharList(this.charArray, this.fromIndex + fromIndex, this.fromIndex + toIndex); } public Iterator<Character> iterator() { return new Iterator<Character>() { int cursor = 0; public boolean hasNext() { return cursor != length(); } public Character next() { return new Character(getCharAt(cursor++)); } public void remove() { throw new UnsupportedOperationException("Remove operation not supportted."); } }; } public static void main(String[] args) { char[] charArray = "0123456789ABCDEF".toCharArray(); CharList charList = new CharList(charArray); for (int i = 0; i < charList.length(); i++) { System.out.print(charList.getCharAt(i) + " "); } System.out.println(); CharList subList = charList.subList(3, 10); for (int i = 0; i < subList.length(); i++) { System.out.print(subList.getCharAt(i) + " "); } System.out.println(); for (char c : subList.subList(2, 4)) { System.out.print(c + " "); } System.out.println(); }} 感谢gtlang78大哥,你的代码很好。不过我现在应该是不能让Array和List同时存在与内存中的。因为我的Array实在太大,如果转成List那就变成双份的内存使用量了。 你再仔细看看代码,这个类里面只保存了一个数组的引用,并没有创建新的数组和复制数组内容,因此也不会占用更多的内存。用subList()方法得到的子列表中的数组其实还是同一个数组。 System.arraycopy()方法可以对同一个数组进行操作,这个方法是一个native方法,如果对同一个数组进行操作时,会首先把从源部分拷贝到一个临时数组,在把临时数组的元素拷贝到目标位置。Object[] a=new Object[1000];System.arraycopy(a,100,a,0,a.length-100); 数组好象没什么办法了,用LIST之类的COLLECTION只会更消耗资源还是用ByteBuffer吧,创建消耗小,对于楼主的问题只要在100的地方MARK一下,然后REWIND()就好了 知道beginIndex / endIndex不就可以了吗?不用copy的!但是这里有一个问题,不用的部分内存不能释放啊! class Test{ int m[] = new int[1000]; public int[] math(int x) { for(int i=0;i<m.length;i++) { m[i] = i; } for(int i=0;i<m.length;i++) { m[i] = x; x++; } return m; } Test() { math(100); for(int i=0;i<m.length;i++) { System.out.println(m[i]); } } public static void main(String args[]) { new Test(); }} 上面的程序有点问题,这个就是了:class Test{ int m[] = new int[100]; public int[] math(int x) { for(int i=0;i<m.length;i++) { m[i] = i; } for(int i=0;i<m.length-x;i++) { m[i] = x; x++; } return m; } Test() { math(33); for(int i=0;i<m.length;i++) { System.out.println(m[i]); } } public static void main(String args[]) { new Test(); }} 对啊,建议用ArrayList好了,操作起来不用这么复杂了! 转换成string行不 然后再用BufferString类不就可以了???我菜 别仍我 public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)我想这个可以帮你解决!! 呵呵,有点意思,既然是由其他流决定长度的,那就在读取的过程中判断从那里开始到那里结束不就搞定了?如果无法判断的话,建议用一个固定大小的缓存如256B,在本地检测其是否有效,如果无效的话抛弃,有效的话保留 ( String.append()) JMF编程问题 急啊 关于读入键盘输入流的一个困惑,求大神解答,快晕了!!! 关于一个迭代的算法问题 enum 这样遍历为什么不行? 数组问题 一个关于用java实现的阶乘的问题 对目前学习Java的疑惑 如何把一个Java程序做成Windows服务 那儿可以下载com.sun.image.codec.jpeg.*包(无内容) java怎么处理无限循环中不可到达的语句?请指教,谢谢 过来看看好吗>我一直不明白~~~~~~~~~~~~~~~~~~~~~~ 一个JAVA的基础题
你把下标为100的数组的值放到下标为0的位置,以此类推不就可以了吗?
在vb里有redim可以很巧妙的解决。
在java里我觉得你还是把值放在list之类的集合类里面,
然后把你不需要的下标对应的值从list里面删掉就可以了。
不知道能否满足楼主的需求阿?
也可以把最后100条数据截取掉。
在VB里使用的是安全数组,它定义了一个结构,其中包含了数组的大小,起始地址等等,你只需要将数组的起始地址改成你想要开始的那个数组元素就可以了.
但是很抱歉,我没有写过这样的程序,无法给你例子.
你可以在网上查找一下: VB指针 这个关键字(好像还有什么葵花宝典的字眼), 好像就是出自CSDN的一篇非常经典的文章,专门讲在VB里如何使用指针来做一些事的.
JAVA里是不是也没有指针阿???
要是有的话就好办了,呵呵
char[] str = ......;
int s = 0;
int end = str.length;
……运算……
然后,你在使用这个数组的时候,就取数组中s和end之间的使用就行了啊
A[i]....Over!
我之所以希望能截取是因为我要传回这个字符数组,如果按boltzjf的做法,那我还必须传回结束的长度位置了。这样就比较麻烦了。
那还是新建一个数组拷贝后返回吧……Java中没有可变数组……
private char[] charArray = null; private int fromIndex; private int toIndex;
public CharList(char[] charArray) {
this(charArray, 0, charArray.length - 1);
} public CharList(char[] charArray, int fromIndex, int toIndex) {
if (fromIndex < 0) {
throw new ArrayIndexOutOfBoundsException("fromIndex < 0");
}
if (toIndex > charArray.length - 1) {
throw new ArrayIndexOutOfBoundsException("toIndex > " + (charArray.length - 1));
} this.charArray = charArray;
this.fromIndex = fromIndex;
this.toIndex = toIndex;
} public int length() {
return toIndex - fromIndex + 1;
}
public char getCharAt(int index) {
return charArray[index + fromIndex];
}
public void setCharAt(int index, char c) {
charArray[index + fromIndex] = c;
}
public CharList subList(int fromIndex, int toIndex) {
if (fromIndex < 0) {
throw new ArrayIndexOutOfBoundsException("fromIndex < 0");
}
if (toIndex > length() - 1) {
throw new ArrayIndexOutOfBoundsException("toIndex > " + (length() - 1));
} return new CharList(this.charArray,
this.fromIndex + fromIndex,
this.fromIndex + toIndex);
} public Iterator<Character> iterator() {
return new Iterator<Character>() {
int cursor = 0; public boolean hasNext() {
return cursor != length();
} public Character next() {
return new Character(getCharAt(cursor++));
} public void remove() {
throw new UnsupportedOperationException("Remove operation not supportted.");
}
};
} public static void main(String[] args) {
char[] charArray = "0123456789ABCDEF".toCharArray();
CharList charList = new CharList(charArray);
for (int i = 0; i < charList.length(); i++) {
System.out.print(charList.getCharAt(i) + " ");
}
System.out.println();
CharList subList = charList.subList(3, 10);
for (int i = 0; i < subList.length(); i++) {
System.out.print(subList.getCharAt(i) + " ");
}
System.out.println(); for (char c : subList.subList(2, 4)) {
System.out.print(c + " ");
}
System.out.println();
}
}
System.arraycopy(a,100,a,0,a.length-100);
还是用ByteBuffer吧,创建消耗小,对于楼主的问题只要在100的地方MARK一下,然后REWIND()就好了
不用copy的!但是这里有一个问题,不用的部分内存不能释放啊!
class Test
{
int m[] = new int[1000];
public int[] math(int x)
{
for(int i=0;i<m.length;i++)
{
m[i] = i;
}
for(int i=0;i<m.length;i++)
{
m[i] = x;
x++;
}
return m;
}
Test()
{
math(100);
for(int i=0;i<m.length;i++)
{
System.out.println(m[i]);
}
}
public static void main(String args[])
{
new Test();
}
}
{
int m[] = new int[100];
public int[] math(int x)
{
for(int i=0;i<m.length;i++)
{
m[i] = i;
}
for(int i=0;i<m.length-x;i++)
{
m[i] = x;
x++;
}
return m;
}
Test()
{
math(33);
for(int i=0;i<m.length;i++)
{
System.out.println(m[i]);
}
}
public static void main(String args[])
{
new Test();
}
}
int srcPos,
Object dest,
int destPos,
int length)
我想这个可以帮你解决!!
如果无法判断的话,建议用一个固定大小的缓存如256B,在本地检测其是否有效,如果无效的话抛弃,有效的话保留 ( String.append())