Сравнение по разным классам - PullRequest
0 голосов
/ 24 октября 2011

Позвольте мне дать код, чтобы вы могли видеть, что я делаю, с помощью следующего кода Java для Android. Скажем, например, у меня есть следующие два класса, один расширенный от другого:

class MyClassOne {
    protected float x, y;
    MyClassOne(float x, float y) { 
        this.x = x; this.y=y;
    }
    public void printY(){
        System.out.print(y); 
    }
}

class MyClassTwo extends MyClassOne {
    protected String stringSpecificToThisClass;
    private long longSpecificTothisClass;
    MyClassTwo(float x, float y, String s, long l) {
        this.x=x; this.y=y; 
        this.longSpecificTothisClass= l; this.stringSpecificTothisClass=s;
    }
}

Эти классы затем инициализируются следующим образом

private ArrayList<MyClassOne> mClassOne = new ArrayList<MyClassOne>();
private ArrayList<MyClassTwo> mClassTwo = new ArrayList<MyClassTwo>();
for(int i=0;i<5;i++){
    Random random = new Random(10);
    mClassOne.add(new MyClassOne(i*12, random.nextInt()));
    mClassTwo.add(new MyClassOne(i*11, random.nextInt()));
}

Теперь я хочу сравнить и отсортировать оба массива в соответствии со значением y.

То, как я делаю это для одного списка, выглядит так:

private Object[][] mSort(){
    Object[][] mSort = new Object[mClassOne.size()][2];
    for(int i = 0; i<mClassOne.size(); i++){
        mSort[i][0] = i;
        mSort[i][1] = mClassOne.get(i).y;
    }
    Arrays.sort(mSort, new Comparator<Object[]>(){
        @Override
        public int compare(Object[] obj1, Object[] obj2){
            Float comp1 = (Float)obj1[1]; Float comp2 = (Float) obj2[1];
            return comp1.compareTo(comp2);
        }
    });
    return mSort;
}

Object[][] mSort = mSort();
for(int i=0;i<mClassOne.size();i++){
    int z = (Integer)mSort[i][0];
    mClassOne.get(z).printY();
}

который мог бы вывести что-то вроде этого:

2, 4, 5, 6, 9

Надеюсь, приведенный выше код достаточно понятен, чтобы другие могли видеть, что я пытаюсь сделать; вопрос:

«Как можно объединить оба ArrayList, а затем отсортировать их по их значению y».

Ответ, который я искал

ArrayList<MyClassOne> mTest = new ArrayList<MyClassOne>();
mTest.addAll(mClassOne);
mTest.addAll(mClassTwo);
Collections.sort(mTest, new Comparator<MyClassOne>(){
    @Override
    public int compare(MyClassOne obj1, MyClassTwo obj2) {
        return (int) (obj1.getY() - obj2.getY()); } 
    }
);
// mTest is now sorted, verified by ~ foreach(mTest) {print mTest.getY(); }

1 Ответ

1 голос
/ 24 октября 2011

Ну, вы могли бы использовать Comparator<MyClassOne>, который должен уметь обрабатывать также MyClassTwo экземпляров, поскольку MyClassTwo расширяет MyClassOne.

Просто создайте один List<MyClassOne>, добавьте все элементы других списков и отсортируйте.

В случаях, когда классы не расширяют друг друга, вводят общий интерфейс.

...