亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于對象拆分為列表,不使用 instanceof

基于對象拆分為列表,不使用 instanceof

UYOU 2021-09-03 21:22:23
我直接進入正題。我上了3節課。人,教授和學生。(角色,教授,校友)。教授和學生都從 Person 擴展。但是 Person 也可以被實例化,因為它不是抽象的。我有 50 人,隨機生成在一個列表中。它可以是任何類型的教授或學生。我想將它們分別分成不同的列表。目前,我是這樣做的:for(Persona persona : personas) {        if(persona instanceof Profesor) {            profesores.add((Profesor) persona);        }        else if(persona instanceof Alumno) {            alumnos.add((Alumno) persona);        }        else {            nuevasPersonas.add(persona);        }    }profesores 是教授名單校友是學生名單nuevasPersonas 是人員列表哪個工作完美。但是有人告訴我不要使用instanceof,所以我不習慣。關于如何在不使用 instanceof 的情況下將它們分成列表的任何想法?謝謝。
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

我會使用instanceof,你為什么不想習慣呢?

無論如何,另一種方法可能是擁有一個變量類型(帶有 getter,但沒有 setter),親自(=0),并在教授和學生中將其覆蓋為 1 和 2。然后,您將測試變量而不是使用 instanceof。


查看完整回答
反對 回復 2021-09-03
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

您可以使用每種對象類型重載“add”方法 - 類似于以下代碼。


main 方法只是將三個不同對象的實例添加到 ObjectSplitter 類中 - 它將它們分離到不同的集合中


public class ObjectSplitter {


public static void main(String ... args){


    ObjectSplitter d = new ObjectSplitter();

    d.addToCollection(new Object1());

    d.addToCollection(new Object1());

    d.addToCollection(new Object2());

    d.addToCollection(new Object1());

    d.addToCollection(new Object1());

    d.addToCollection(new Object1());

    d.addToCollection(new Object2());

    d.addToCollection(new Object3());

    d.addToCollection(new Object1());


    System.out.println("Num Ob1s : " + d.getOb1sSize());

    System.out.println("Num Ob2s : " + d.getOb2sSize());

    System.out.println("Num Ob3s : " + d.getOb3sSize());


}


private List<Object1> ob1s = new ArrayList<>();

private List<Object2> ob2s = new ArrayList<>();

private List<Object3> ob3s = new ArrayList<>();


void addToCollection(Object1 o){

    ob1s.add(o);

}


void addToCollection(Object2 o){

    ob2s.add(o);

}


void addToCollection(Object3 o){

    ob3s.add(o);

}


int getOb1sSize(){

    return ob1s.size();

}


int getOb2sSize(){

    return ob2s.size();

}


int getOb3sSize(){

    return ob3s.size();

}


static class Object1 {


}



static class Object2 extends Object1 {


}


static class Object3 extends Object2 {


}

}


查看完整回答
反對 回復 2021-09-03
?
holdtom

TA貢獻1805條經驗 獲得超10個贊

您也可以使用 getClass().getSimpleName() 如下:


public static void main (String[] args) throws java.lang.Exception

{

    List<Test1> list = new ArrayList<>(2);

    Test1 o1 = new Test1();

    list.add(o1);

    Test2 o2 = new Test2();

    list.add(o2);

    for (Test1 test : list) {

        System.out.println(test.getClass().getSimpleName());

    }

}

static class Test1{


}

static class Test2 extends Test1{


}

在 for 循環中,您可以使用如下代碼的 if 條件來完成您的工作:


for (Test1 test : list) {

    String className = test.getClass().getSimpleName();

    if(className.equals("Test1")) {

       System.out.println("Test1");

    } else if(className.equals("Test2")) {

       System.out.println("Test2");

    }

    System.out.println();

}

根據覆蓋方法的另一種解決方案是:


public static void main (String[] args) throws java.lang.Exception

{

    List<Test1> list = new ArrayList<>(2);

    Test1 o1 = new Test1();

    list.add(o1);

    Test2 o2 = new Test2();

    list.add(o2);

    for (Test1 test : list) {

        test.addToMyTypeList();

    }

    for(Test1 test : Test1.list) {

        System.out.println(test.getClass().getSimpleName());

    }

    for(Test1 test : Test1.list) {

        System.out.println(test.getClass().getSimpleName());

    }

}

static class Test1{

    public static List<Test1> list = new ArrayList<>();

    public void addToMyTypeList() {

        String className = test.getClass().getSimpleName();

        if(className.equals("Test1")) {

                    Test1.list.add(this);

        }

    }

}

static class Test2 extends Test1{

    public static List<Test1> list = new ArrayList<>();


    @Override

    public void addToMyTypeList() {

        String className = test.getClass().getSimpleName();

        if(className.equals("Test2")) {

                    Test2.list.add(this);

        }

    }

}


查看完整回答
反對 回復 2021-09-03
  • 3 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號