Java айнымалы массив ұзындығы

Java жобасын құрастыруда қиындықтар туындады, себебі массивтің толық ұзындығы (айнымалы) менің Object массивінде дұрыс емес дегенді білдірмейді.

import java.util.Arrays;

public class ObjectList {
    private int N;
    private Object[] fractionList = new Object[N];

    public ObjectList(int n){
        this.N = n;
    }

    public int capacity(){
        return this.N;
    }

    public void setN(int n){
    this.N = n;
    }

    public String toString(){
        return Arrays.toString(fractionList);
    }
}

public class FractionDriver {
    public static void main(String[] args){

   //creates the object list, sets N to 4
    ObjectList list = new ObjectList(4);

    System.out.println("The Objectlist has " + list.capacity() + " lines");

   //prints the array
    System.out.println(list.toString());
    }
}

компилятор келесідей нәтиже береді:

The ObjectList has 4 lines
[]

Осы себепті мен массивке ешқандай нысандарды қосуға болмайды. Компилятор ArrayIndexOutOfBoundsException: 0 деп атайды және массивте ешқандай элементтер жоқ екенін айтады.

Егер мен N нысанының алаптың үлгісінің айнымалы мәніне деген ауыстырсам, келесідей:

private Object[] fractionList = new Object[4];

Компилятор бақытты және массивтің ұзындығын 4-ке теңшейді.

Мен не істеп жатырмын?

2
хабар компилятордан келмейді. бұл сіздің бағдарламаңыздың шығарылымы.
қосылды автор Joshua, көзі
хабар компилятордан келмейді. бұл сіздің бағдарламаңыздың шығарылымы.
қосылды автор Joshua, көзі
Жауапты жауап ретінде тануды ұмытпаңыз немесе егер сіз әлі де көмекке мұқтаж болсаңыз, жауапты түсініктемеде сұраңыз, @nisoramen.
қосылды автор Mathias Bader, көзі
Жауапты жауап ретінде тануды ұмытпаңыз немесе егер сіз әлі де көмекке мұқтаж болсаңыз, жауапты түсініктемеде сұраңыз, @nisoramen.
қосылды автор Mathias Bader, көзі

8 жауаптар

Ұзындығы белгілі болған конструктордағы жиым данасын жасауға болады:

private Object[] fractionList;

public ObjectList(int n){
    this.N = n;
    this.fractionList = new Object[n];
}

Алайда N мәнін өзгерткен кезде жиынды қайта жасауды қалауыңыз мүмкін:

public void setN(int n){
    this.N = n;
   //consider copying data from the old array to the new array
    this.fractionList = new Object[n];
}
4
қосылды
@Бери иә, мен бұл кодтың ішіндегі түсініктемеде айттым. Бұл ретте setN-нің қажетті логикасына байланысты. Әрине, ескі массивтің элементтеріне сәйкес келетін жаңа массив тым кішкентай болатын жағдайды да реттеу керек.
қосылды автор Eran, көзі
SetN әдісінде біз жаңадан ғана емес, жаңа элементтерді клондауды реттеп қана қоймай, сонымен қатар бұл кішігірім жақсарту :)
қосылды автор Beri, көзі

Ұзындығы белгілі болған конструктордағы жиым данасын жасауға болады:

private Object[] fractionList;

public ObjectList(int n){
    this.N = n;
    this.fractionList = new Object[n];
}

Алайда N мәнін өзгерткен кезде жиынды қайта жасауды қалауыңыз мүмкін:

public void setN(int n){
    this.N = n;
   //consider copying data from the old array to the new array
    this.fractionList = new Object[n];
}
4
қосылды
@Бери иә, мен бұл кодтың ішіндегі түсініктемеде айттым. Бұл ретте setN-нің қажетті логикасына байланысты. Әрине, ескі массивтің элементтеріне сәйкес келетін жаңа массив тым кішкентай болатын жағдайды да реттеу керек.
қосылды автор Eran, көзі
SetN әдісінде біз жаңадан ғана емес, жаңа элементтерді клондауды реттеп қана қоймай, сонымен қатар бұл кішігірім жақсарту :)
қосылды автор Beri, көзі

Мәселе - сызық

private Object[] fractionList = new Object[N];

конструктор алдында орындалады. Инициализацияның тәртібі әрдайым төмендегідей:

  1. Егер суперкласс бар болса, оны алдымен инициализациялаңыз
  2. Статикалық айнымалы декларация және статикалық инициализаторлар пайда болу тәртіптемесінде
  3. Сыртқы айнымалы мәлімдемені және инициализаторлардың сыртқы көрінісі бойынша
  4. Конструктор.

Сіз конструктордағы кодты (4) массивтің ұзындығын орнату үшін алғыңыз келді, бірақ жиым сендердің дана айнымалы мәндерінде (3) жасалған.

Мен мынаны ұсынамын:

public class ObjectList {
    private int N;
    private Object[] fractionList;

    public ObjectList(int n){
        fractionList = new Object[n];
        this.N = n;
    }

    public int capacity(){
        return this.N;
    }

    public void setN(int n){
       //might want to copy content from old array to new one here
        fractionList = new Object[n];
        this.N = n;
    }

    public String toString(){
        return Arrays.toString(fractionList);
    }
}

Егер Java Beans-ге сәйкес келгіңіз келсе, getCapacity() дегенге сыйымдылығы() әдісін қайта атауды ұсынамын.

2
қосылды

Мәселе - сызық

private Object[] fractionList = new Object[N];

конструктор алдында орындалады. Инициализацияның тәртібі әрдайым төмендегідей:

  1. Егер суперкласс бар болса, оны алдымен инициализациялаңыз
  2. Статикалық айнымалы декларация және статикалық инициализаторлар пайда болу тәртіптемесінде
  3. Сыртқы айнымалы мәлімдемені және инициализаторлардың сыртқы көрінісі бойынша
  4. Конструктор.

Сіз конструктордағы кодты (4) массивтің ұзындығын орнату үшін алғыңыз келді, бірақ жиым сендердің дана айнымалы мәндерінде (3) жасалған.

Мен мынаны ұсынамын:

public class ObjectList {
    private int N;
    private Object[] fractionList;

    public ObjectList(int n){
        fractionList = new Object[n];
        this.N = n;
    }

    public int capacity(){
        return this.N;
    }

    public void setN(int n){
       //might want to copy content from old array to new one here
        fractionList = new Object[n];
        this.N = n;
    }

    public String toString(){
        return Arrays.toString(fractionList);
    }
}

Егер Java Beans-ге сәйкес келгіңіз келсе, getCapacity() дегенге сыйымдылығы() әдісін қайта атауды ұсынамын.

2
қосылды

Біріншіден, бұл құрастыру қателігі емес. Бағдарлама жақсы жиналады. Мәселе мынада, fractionList массиві бұрын инсталляцияланса, конструктордың денесі N айнымалысы орнатылған деп аталады.

Инициализацияны конструкторға жылжытуға болады:

private Object[] fractionList;


public ObjectList(int n) {
    this.N = n;
    fractionList = new Object[N];
}
1
қосылды

Біріншіден, бұл құрастыру қателігі емес. Бағдарлама жақсы жиналады. Мәселе мынада, fractionList массиві бұрын инсталляцияланса, конструктордың денесі N айнымалысы орнатылған деп аталады.

Инициализацияны конструкторға жылжытуға болады:

private Object[] fractionList;


public ObjectList(int n) {
    this.N = n;
    fractionList = new Object[N];
}
1
қосылды

Object [] fractionList баптандырылса, N өрісінің мәні «көрінбейтін» болып табылады, себебі оның мәні < кодты> this.N = n; деп аталады.

Жиынды инициализациялау үшін конструкторға N параметрін жіберуге болады. Бір нәрсе:

public ObjectList(int n){
    this.fractionList = new Object[n];
}
0
қосылды

Object [] fractionList баптандырылса, N өрісінің мәні «көрінбейтін» болып табылады, себебі оның мәні < кодты> this.N = n; деп аталады.

Жиынды инициализациялау үшін конструкторға N параметрін жіберуге болады. Бір нәрсе:

public ObjectList(int n){
    this.fractionList = new Object[n];
}
0
қосылды