| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 572 人关注过本帖
标题:请教高手帮忙看看程序输出有问题
只看楼主 加入收藏
零下零度
Rank: 1
等 级:新手上路
帖 子:60
专家分:5
注 册:2009-3-19
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:7 
请教高手帮忙看看程序输出有问题
[free]public class TestBubbleSort {
    public static void main(String[] args) {
        BubbleArray ab = new BubbleArray(10);
        ab.add(20);
        ab.add(10);
        ab.add(33);
        ab.add(44);
        ab.add(99);
        ab.add(24);
        ab.add(11);
        ab.add(55);
        ab.add(88);    
        ab.add(22);
        
        ab.display();
        ab.insertSort();        
        ab.display();
        ab.delete(10);
        ab.display();
    }
}

class BubbleArray {
    private long[] a;
    private int nElems;
    
    BubbleArray(int max){
        a = new long[max];
        nElems = 0;
    }
    
    public void add(long value) {
        a[nElems] = value;
        nElems ++;
    }
    
    public boolean find(long value) {
        int i;
        for(i = 0; i < nElems; i++) {
            if(a[i] == value) {
                break;
            }
        }
        if(i == nElems) {
            return false;
        } else {
            return true;
        }
    
    }

    public void delete(long value){
        if(nElems == 0) {
            System.out.println("数组中已经没有元素了!");
        } else {
            for(int i = 0; i < nElems; i++) {
                if(a[i] == value) {
                    for(int j = i; j < nElems; j++) {
                        a[j] = a[j+1];
                    }
                                        
                }
                nElems--;                
            }    
        }
    }
/*//泡沫排序法
    public void bubbleSort() {
        long temp = 0;
        for(int i = nElems - 1; i > 1; i--) {  //排序的趟数
            for(int j = 0; j < i; j++){          //j<i:i后面的数已经排好序了,不需再比较
                if(a[j] > a[j +1]) {
                    swap(j, j + 1);
                    
                }
            }
        }
    }
*/ //交换算法    
  public void swap(int x, int y){
      long temp = a[x];
      a[x] = a[y];
      a[y] = temp;
  }
/* //选择排序法
    public void selectionSort(){
        for(int i = 0; i < nElems - 1; i++) {
            int min = i;                           
            for(int j = min + 1; j < nElems; j++) {
                if(a[j] < a[min]) {
                    min = j;                              //交换下标
                }                
            }
            swap(min, i);
        }
    }
*/
    //插入排序
    public void insertSort() {
        long temp;
        
        for(int i = 1; i < nElems; i++) {
            temp = a[i];
            int j = i;
            while(j > 0 && a[j - 1] >= temp) {
                a[j] = a[j - 1];
                --j;
            }
            a[j] = temp;
        }
    }
    
    public void display() {
        for(int i = 0; i < nElems; i++) {
            System.out.print(a[i] + "\t");
        }
        System.out.println();
    }
}[/free]
输出异常:
当ab.delete(10)时
20      10      33      44      99      24      11      55      88      22
10      11      20      22      24      33      44      55      88      99
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
        at BubbleArray.delete(TestBubbleSort.java:59)
        at TestBubbleSort.main(TestBubbleSort.java:18)


当ab.delete(除10之外的数)时 比如ab.delete(11)时输出为:
20      10      33      44      99      24      11      55      88      22
10      11      20      22      24      33      44      55      88      99
10      20      22      24      33  ( 其他数也只显示五个)
请教高手:为什么会出现以上两种情况呢,是不是delete() 方法不对呀,麻烦高手帮帮忙,不甚感激!!!

[[it] 本帖最后由 零下零度 于 2009-8-5 19:38 编辑 [/it]]
搜索更多相关主题的帖子: 输出 
2009-08-05 19:37
usbboy2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:183
注 册:2009-7-31
收藏
得分:3 
public void delete(long value){
        if(nElems == 0) {
            System.out.println("数组中已经没有元素了!");
        } else {
            for(int i = 0; i < nElems; i++) {
                if(a[i] == value) {
                    for(int j = i; j < nElems-1; j++) {   //j<nElems-1
                        a[j] = a[j+1];
                    }
                                         
                }
                                 
            }
            nElems--;  //长度减1放错位置了
        }
    }
2009-08-05 22:10
零下零度
Rank: 1
等 级:新手上路
帖 子:60
专家分:5
注 册:2009-3-19
收藏
得分:0 
回复 2楼 usbboy2009

这个问题我已经想过了,我也试过了,还是有问题!
2009-08-07 10:43
零下零度
Rank: 1
等 级:新手上路
帖 子:60
专家分:5
注 册:2009-3-19
收藏
得分:0 
明显当删除10的时候抛出异常,而删除其他数时能删除,但是多删了四个数???
2009-08-07 10:45
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
public void delete(long value){
        if(nElems == 0) {
            System.out.println("数组中已经没有元素了!");
        } else {
            for(int i = 0; i < nElems; i++) { //其实可以一层循环删除多个重复的数
                if(a[i] == value) {
                    for(int j = i; j < nElems; j++) {
                        a[j] = a[j+1]; //越界异常
                    }
                    nElems--;                       
                }
                              
            }     
        }
    }
   

倚天照海花无数,流水高山心自知。
2009-08-07 11:12
usbboy2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:183
注 册:2009-7-31
收藏
得分:7 
程序代码:
public class TestBubbleSort { 
    public static void main(String[] args) { 
        BubbleArray ab = new BubbleArray(10); 
        ab.add(20); 
        ab.add(10); 
        ab.add(33); 
        ab.add(44); 
        ab.add(99); 
        ab.add(24); 
        ab.add(11); 
        ab.add(55); 
        ab.add(88);     
        ab.add(22); 
         
        ab.display(); 
        ab.insertSort();         
        ab.display(); 
        ab.delete(24); 
        ab.display(); 
    } 
} 

 
class BubbleArray { 
    private long[] a; 
    private int nElems; 
     
    BubbleArray(int max){ 
        a = new long[max]; 
        nElems = 0; 
    } 
     
    public void add(long value) { 
        a[nElems] = value; 
        nElems ++; 
    } 
     
    public boolean find(long value) { 
        int i; 
        for(i = 0; i < nElems; i++) { 
            if(a[i] == value) { 
                break; 
            } 
        } 
        if(i == nElems) { 
            return false; 
        } else { 
            return true; 
        } 
     
    } 

 
    public void delete(long value){ 
        if(nElems == 0) { 
            System.out.println("数组中已经没有元素了!"); 
        } else { 
            for(int i = 0; i < nElems; i++) {           
                if(a[i] == value) { 
                    for(int j = i; j < nElems-1; j++) { 
                        a[j] = a[j+1]; 
                    } 
                                         
                } 
                                 
            } 
            nElems--; 
        } 
    } 
/*//泡沫排序法 
    public void bubbleSort() { 
        long temp = 0; 
        for(int i = nElems - 1; i > 1; i--) {  //排序的趟数 
            for(int j = 0; j < i; j++){          //j<i:i后面的数已经排好序了,不需再比较 
                if(a[j] > a[j +1]) { 
                    swap(j, j + 1); 
                     
                } 
            } 
        } 
    } 
*/ //交换算法     
  public void swap(int x, int y){ 
      long temp = a[x]; 
      a[x] = a[y]; 
      a[y] = temp; 
  } 
/* //选择排序法 
    public void selectionSort(){ 
        for(int i = 0; i < nElems - 1; i++) { 
            int min = i;                            
            for(int j = min + 1; j < nElems; j++) { 
                if(a[j] < a[min]) { 
                    min = j;                              //交换下标 
                }                 
            } 
            swap(min, i); 
        } 
    } 
*/  
    //插入排序 
    public void insertSort() { 
        long temp; 
         
        for(int i = 1; i < nElems; i++) { 
            temp = a[i]; 
            int j = i; 
            while(j > 0 && a[j - 1] >= temp) { 
                a[j] = a[j - 1]; 
                --j; 
            } 
            a[j] = temp; 
        } 
    } 
     
    public void display() { 
        for(int i = 0; i < nElems; i++) { 
            System.out.print(a[i] + "\t"); 
        } 
        System.out.println(); 
    } 
} 
测试过没问题 在你代码里delete更改了2个地方
1: j < nElems改为j < nElems-1  (在2楼代码里已经注释了你没注意看)
2:   nElems-- 放到外层循环

[ 本帖最后由 usbboy2009 于 2009-8-7 14:13 编辑 ]
2009-08-07 14:10
零下零度
Rank: 1
等 级:新手上路
帖 子:60
专家分:5
注 册:2009-3-19
收藏
得分:0 
回复 6楼 usbboy2009

谢谢,懂了!
不过我还是觉得nElems-- 放到if里面比较好
2009-08-12 10:50
usbboy2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:183
注 册:2009-7-31
收藏
得分:0 
程序代码:
 public void delete(long value){ 
        if(nElems == 0) { 
            System.out.println("数组中已经没有元素了!"); 
        } else { 
            for(int i = 0; i < nElems; i++) { 
                if(a[i] == value) { 
                    for(int j = i; j < nElems-1; j++) { 
                        a[j] = a[j+1]; 
                    } 
                    nElems--;    //放这里比较合适 可以解决重复元素                                     
                } 
                
            }     
        } 
    } 
2009-08-12 15:35
快速回复:请教高手帮忙看看程序输出有问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019751 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved