不同类别的比较

发布于 2024-12-11 17:50:14 字数 2306 浏览 0 评论 0原文

让我给出一些代码,以便您可以看到我使用以下 Android 的 java 代码做了什么。举例来说,我有以下两个类,一个是从另一个类扩展的:

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(); }

Let me give some code so you can see what I'm doing with the following java code for android. Say for example I have the following two classes, one extended from the other:

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;
    }
}

These classes are then initialized in the following way

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()));
}

now, what I want to do is compare and sort both arraylists according to the value of y.

The way i do this for a single list is like so:

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();
}

which could output something like this:

2, 4, 5, 6, 9

Hopefully the code above is clear enough so others can see what I'm trying to do; the question is:

"How could I combine both ArrayLists then sort them by their respective y value."

The Answer I was looking for

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(); }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你的他你的她 2024-12-18 17:50:14

好吧,您可以使用 Comparator ,它也应该能够处理 MyClassTwo 实例,因为 MyClassTwo 扩展了 MyClassOne< /代码>。

只需创建一个 List,添加其他列表的所有元素并排序。

在类不互相扩展的情况下,引入一个公共接口。

Well, you could use a Comparator<MyClassOne> which should be able to handle MyClassTwo instances as well, since MyClassTwo extends MyClassOne.

Just create a single List<MyClassOne>, add all elements of the other lists and sort.

In cases where the classes don't extend each other, introduce a common interface.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文