为什么我的排序功能做错了?

Why is my sort function doing the job incorectly?

显然,当我只对参数化对象进行排序时,它会完美地执行,但是当我添加没有数据的对象时,它就会变得疯狂。帮助。

顺便说一句,我希望按“Stanje na racunu”或英文“您的帐户余额”降序排列数据,它采用对象 class 中的“stanje”变量并进行比较.我再重复一遍。当不包括 tr1、tr2 和 tr3 时,这可以完美地工作。帮助

    public class Glavna {
    
    public static void sort(TekuciRacun[] racuni) {
        TekuciRacun heljp = new TekuciRacun();
        
        for ( int i = 0; i < racuni.length - 1; i++)
            for ( int j = 1; j < racuni.length; j++)
                if ( racuni[i].getStanje() > racuni[j].getStanje() ) {
                    heljp = racuni[i];
                    racuni[i] = racuni[j];
                    racuni[j] = heljp;
                }
        
        for ( int i = 0; i < racuni.length; i++)
            System.out.println("\n" + racuni[i].toString());
    } 

    public static void main(String[] args) {

        TekuciRacun ptr1 = new TekuciRacun("Marko Sisovic", 29381024, 20000, 15000, 0, -10000);
        TekuciRacun ptr2 = new TekuciRacun("Petar Gojkovic", 12341234, 25000, 10000, 5000, -15000);
        TekuciRacun ptr3 = new TekuciRacun("Milojko Marivic", 23455423, 30000, 20000, 15000, -30000);
        
        TekuciRacun tr1 = new TekuciRacun();
        TekuciRacun tr2 = new TekuciRacun();
        TekuciRacun tr3 = new TekuciRacun();
        
        TekuciRacun[] racuni = { ptr1, ptr2, ptr3, tr1, tr2, tr3};
        
        sort(racuni);
    }
}

这是结果。

Ime i prezime vlasnika: Milojko Marivic
Broj racuna: 23455423
Stanje na racunu: -5000 dinara <====this is the data that's used for sorting
Dozvoljen minus: -30000 dinara

Ime i prezime vlasnika: Petar Gojkovic
Broj racuna: 12341234
Stanje na racunu: 10000 dinara <====
Dozvoljen minus: -15000 dinara

Ime i prezime vlasnika: Marko Sisovic
Broj racuna: 29381024
Stanje na racunu: 5000 dinara <====
Dozvoljen minus: -10000 dinara

Ime i prezime vlasnika: null
Broj racuna: 0
Stanje na racunu: 0 dinara 
Dozvoljen minus: 0 dinara

Ime i prezime vlasnika: null
Broj racuna: 0
Stanje na racunu: 0 dinara 
Dozvoljen minus: 0 dinara

Ime i prezime vlasnika: null
Broj racuna: 0
Stanje na racunu: 0 dinara 
Dozvoljen minus: 0 dinara

    public class TekuciRacun implements IRacun{
    private String vlasnik;
    private int brojRacuna;
    private int uplate;
    private int isplate;
    private int kredit;
    private int dozvoljenMinus;
    private int stanje = 0;
    
    TekuciRacun(){
        
    }
    
    TekuciRacun (String vlasnik, int brojRacuna, int uplate, int isplate, int kredit, int dozvoljenMinus){
        super();
        this.vlasnik = vlasnik;
        this.brojRacuna = brojRacuna;
        this.uplate = uplate;
        this.isplate = isplate;
        this.kredit = kredit;
        this.dozvoljenMinus = dozvoljenMinus;
        
        this.stanje = stanje(uplate, isplate, kredit);
    }
    
    @Override
    public int stanje(int uplate, int isplate, int kredit) {
        return stanje = uplate - isplate - kredit;
    }
    
    @Override
    public String toString() {
        return "Ime i prezime vlasnika: " + vlasnik 
                + "\nBroj racuna: " + brojRacuna
                + "\nStanje na racunu: " + stanje(uplate, isplate, kredit)
                + " dinara \nDozvoljen minus: " + dozvoljenMinus
                + " dinara\nKredit: " + kredit;
    }

    public String getVlasnik() {
        return vlasnik;
    }

    public int getBrojRacuna() {
        return brojRacuna;
    }

    public int getUplate() {
        return uplate;
    }

    public int getIsplate() {
        return isplate;
    }

    public int getKredit() {
        return kredit;
    }

    public int getDozvoljenMinus() {
        return dozvoljenMinus;
    }

    public int getStanje() {
        return stanje;
    }

    public void setVlasnik(String vlasnik) {
        this.vlasnik = vlasnik;
    }

    public void setBrojRacuna(int brojRacuna) {
        this.brojRacuna = brojRacuna;
    }

    public void setUplate(int uplate) {
        this.uplate = uplate;
    }

    public void setIsplate(int isplate) {
        this.isplate = isplate;
    }

    public void setKredit(int kredit) {
        this.kredit = kredit;
    }

    public void setDozvoljenMinus(int dozvoljenMinus) {
        this.dozvoljenMinus = dozvoljenMinus;
    }

    public void setStanje(int stanje) {
        this.stanje = stanje;
    }
    
    
    
}

期望的输出是(不是完整的,只有名字(vlasnik))

  1. 佩塔尔·戈伊科维奇
  2. 马尔科·西索维奇
  3. 米洛伊科·马里维奇

编辑。 调试后(在两个 for 循环之间添加一个 println)我可以看到,在第一次“i”迭代后,结果是完美的,但是,循环继续进行,但开始做一些它不应该做的事情。我想这超出了我的知识范围,因为我想这是一些编译器“问题”。

你的循环逻辑不正确。为了进行正确的排序,内部循环 (j) 必须从当前的 i+1 向上开始。相反,它每次都从 1 开始。当你只有3个元素时,你可能看不出问题。

基本上,它将已排序区域中的元素与未排序区域中的元素进行比较。