【发布时间】:2015-08-13 16:56:21
【问题描述】:
我有一个程序可以生成数字组合的排列。排列具有给定的大小(在本例中为 6)。我的问题是我得到一个 java.lang.OutOfMemoryError: Java heap space error 具有更大的数字组合。例如,如果我计算 18 个数字的排列,我会得到这个异常:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at javax.swing.text.GapContent.allocateArray(Unknown Source)
at javax.swing.text.GapVector.resize(Unknown Source)
at javax.swing.text.GapVector.shiftEnd(Unknown Source)
at javax.swing.text.GapContent.shiftEnd(Unknown Source)
at javax.swing.text.GapVector.open(Unknown Source)
at javax.swing.text.GapVector.replace(Unknown Source)
at javax.swing.text.GapContent.insertString(Unknown Source)
at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
at javax.swing.text.AbstractDocument.insertString(Unknown Source)
at javax.swing.text.PlainDocument.insertString(Unknown Source)
at javax.swing.JTextArea.append(Unknown Source)
at test.permute(test.java:48)
at test.permute(test.java:52)
at test.permute(test.java:52)
at test.permute(test.java:52)
at test.permute(test.java:52)
at test.permute(test.java:52)
at test.permute(test.java:52)
at test.actionPerformed(test.java:74)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
现在这似乎是由打印出 JTextArea 中的排列引起的,因为如果您查看异常的第一行,您可以在 javax.swing.text 中看到错误。
这是我使用的代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
public class test extends JFrame implements ActionListener {
private JPanel panel;
private JButton ok;
private JTextArea text;
private String str;
private JScrollPane scroll;
public test() {
panel = new JPanel();
ok = new JButton("OK");
ok.addActionListener(this);
str = ("1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ");
text = new JTextArea(str, 16, 16);
text.setEditable(true);
scroll = new JScrollPane(text);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
panel.add(scroll);
panel.add(ok);
add(panel);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new test();
}
//-----------------------------------------------------------------------------------
public void permute(java.util.List<Integer> intList, int k, int max) {
if(k == max) {
text.append(Arrays.toString(intList.subList(0, max).toArray()).replaceAll( "\\[|\\]", "") + ", \n");
} else {
for(int i = k; i < intList.size(); i++){
java.util.Collections.swap(intList, i, k);
permute(intList, k+1, max);
java.util.Collections.swap(intList, k, i);
}
}
}
//-----------------------------------------------------------------------------------
@Override
public void actionPerformed(ActionEvent arg0) {
String a = text.getText();
text.setText("");
String[] zahlenstring = a.split(", ");
int[] zahlenint = new int[zahlenstring.length];
for(int i = 0; i < zahlenstring.length ;i++) {
zahlenint[i] = Integer.parseInt(zahlenstring[i]); }
ArrayList<Integer> intList = new ArrayList<Integer>();
for (int i = 0; i < zahlenint.length; i++) {
intList.add(zahlenint[i]); }
permute(intList, 0, 6);
}
}
我寻找了解决方案,但我主要找到了将 ram 添加到 java 或使用多线程的建议,我不想在这里使用它们。
现在我的问题是:我怎样才能改进这段代码,让它不再给我那个例外?这里还有什么需要改进的地方吗?
如果您还有问题,可以在 cmets 中提问。提前致谢。
【问题讨论】:
-
提示:18 个数的排列有多少?你有多少内存?
-
您可以要求不可能,但不要期望得到有用的答案。 18!是一个很大的数字。
-
@nneonneo 我有一个 8 GB RAM 的笔记本,但只有 4 GB RAM 的笔记本需要该程序。
-
您的代码在
text.append处失败,因此不太可能做任何不同的事情...
标签: java algorithm exception permutation heap-memory