我有一个程序利用Swing GUI和新的排序算法以及搜索功能。我的排序工作正常,但是当尝试搜索数字时,无论是否找到它,它都会给出一条消息。但是,宁可说它在数字存在时也找到了它,而是说它没有找到。而且由于某种原因,它只说在索引4上找到了0。
static int Numbers[]=new int[0];
private static class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//get data
String data = txtInput.getText();
//parse for numerical value
int numGenerate = Integer.parseInt(data);
int Numbers[]=new int[numGenerate];
String command = e.getActionCommand();
if (command.equals("Sort"))
{
String unSortedData="";
//ouput unsoted data
for (int x=0;x<=Numbers.length-1;x++)
{
Numbers[x]=(int)(Math.random()*2001)-1000;
unSortedData+=(Numbers[x]+",");
}
txtUnsorted.setText(unSortedData);
if (btnQuickSort.isSelected())
{
QuickSort(Numbers,0,Numbers.length-1);
}
if (btnMergeSort.isSelected())
{
MergeSort(Numbers,0,Numbers.length-1);
}
if (btnInsertionSort.isSelected())
{
InsertionSort(Numbers);
}
if (btnSelectionSort.isSelected())
{
SelectionSort(Numbers);
}
if (btnShellSort.isSelected())
{
ShellSort(Numbers);
}
if (btnShakerSort.isSelected())
{
ShakerSort(Numbers);
}
generated=true;
}
if (command.equals("Search"))
{
//get data
String data2 = txtSearch.getText();
//parse for numerical value
int FindNum = Integer.parseInt(data2);
if (generated==true)
{
int counter=0;
for (int x=0;x<Numbers.length;x++)
{
if (Numbers[x]==FindNum)
{
lblSearch.setText("Status: Found "+ FindNum+ "at index "+ counter );
}
counter++;
}
}
else
{
lblSearch.setText("Status:Error! Enter or sort a number");
}
}
}
}
目前,如果您运行“搜索”组件,则仅使用随机数填充数组。我建议将生成和两个操作拆分为单独的方法:
private int[] randomNumbers(int size) {
Random random = new Random();
int[] numbers = new int[size];
for (int i = 0; i < numbers.length; i++)
numbers[i] = random.nextInt(2000) - 1000;
unsortedData = Arrays.toString(numbers);
}
public void actionPerformed(ActionEvent e) {
int[] numbers = randomNumbers(Integer.valueOf(txtInput.getText());
switch(e.getActionCommand()) {
case "sort":
...
break;
case "search":
...
break;
}
}
注意,有一种更简单的方法来获取随机整数数组:
int[] numbers = random.ints(size, -2000, 2000).toArray();
但是我假设您还没有使用流。
在actionPerformed()中,通过掩盖全局变量“ Numbers”的“ int Numbers [] = new int [numGenerate]”定义了一个名为“ Numbers”的新局部变量。当您删除“ int”并使用“ Numbers = new int [numGenerate]”时,可以在此处使用全局变量“ Numbers”,并且程序可以按预期工作。