你好伙伴Stackoverflowers。我一直在玩java中的数组,我一直在尝试在数组中存储大量的值。但是,我无法在数组中存储超过一定数量的值:
String data[] = new String[44681003];
//由于某种原因,44681003是我可以访问的最高数字,直到它通过控制台发出一条丑陋的红色错误消息:
线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间
我有一个程序可以生成给定字符串列表的所有排列,并且它完美地工作,直到我必须生成一个大于那个奇怪的44680815数字的数字。 (例如:387420489,即9 ^ 9)
我已经尝试存储该值并在for循环中将其打印到控制台,将值设置回null data[i] = null;
我只是想知道是否有办法在数组中存储大量值?
或
能够简单地打印出我的值,然后将其从存储在数组中删除。
这是我的代码:
public class Permutations {
public static void main(String[] args) {
String database = "abcdefghi";
// String data[] = new String[(int) Math.pow(database.length(), database.length())];
// ^^ I would like to make it this long, but It gives an error.
String data[] = new String[44681003];
StringBuilder temp;
for (int i = 0;i<Math.pow(database.length(), database.length());i++){
String base = Integer.toString(i,database.length());
data[i] = base;
if (base.length()!=database.length()){
temp = new StringBuilder("");
for (int x = 0;x < (database.length()-data[i].length());x++){
temp.append('0');
}
base = temp + base;
}
for (int y = 0;y<database.length();y++){
base = base.replace((char)('0' + y), database.charAt(y));
}
data[i]=null;
System.out.println("Pos: " + i + " " + base); //<-- USE THIS TO WRITE IT OUT
}//end big for loop
System.out.println("Done");
}
}
控制台中的最后一行:
Pos: 44680997 badagahcc
Pos: 44680998 badagahcd
Pos: 44680999 badagahce
Pos: 44681000 badagahcf
Pos: 44681001 badagahcg
Pos: 44681002 badagahch
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 44681003
at Permutations.main(Permutations.java:20)
我的电脑规格: http://store.asus.com/us/item/201510AM160007799/A17602
感谢您的时间!我希望我能找到一个解决方案,也许可以帮助其他人有相同/类似的问题!
答案 0 :(得分:3)
如果您收到OutOfMemoryError,您的程序需要更多内存来执行您要求它执行的操作
但是,由于您没有保留存储在数组中的任何字符串,例如
data[i] = null;
我建议你删除阵列,因为你不需要它。这将解决你的记忆问题。
您可以将代码转换为函数,这样即使您以后需要随机访问也无需构建数组。
是的,你得到N!来自一组N的排列,因为你不能重复任何字母。例如badagahcc
不是排列,因为它有a
3次,c
两次。
public static String generate(String letters, long number) {
// get a list of the all the possible characters assuming no duplicates.
List<Character> chars = new ArrayList<>(letters.length());
for (int i = 0; i < letters.length(); i++)
chars.add(letters.charAt(i));
// start with a string builder.
StringBuilder ret = new StringBuilder(letters.length());
// while we have characters left
while(chars.length() > 0) {
// select one of the unused characters
int select = number % chars.length();
// take out the lower portion of the number and use the next portion
number /= chars.length();
// Append the N-th character, but remove it so it doesn't get used again.
ret.append(chars.remove(select));
}
assert number == 0; // otherwise we have not enough letters.
return ret;
}
这样你就可以在没有记忆的情况下得到任何排列。