0

オブジェクトで満たされた配列リストがあります。各オブジェクトは 2 つの整数で構成されます。元の整数で 2 番目の整数を保持しながら、最初の整数に基づいて配列リストを並べ替えるにはどうすればよいですか? 次に、ソートされた配列リストの 2 番目の整数をすべて追加するにはどうすればよいですか?

私はこれを試しました:

Collections.sort(info, new Comparator()
    {
        public int compare(M one, M two) 
        {
            return m1.getCost().compareToIgnoreCase(m2.getCost());
        }

    });

class M{
//Declares the attributes belonging to this class
private int money;
private int cost;

//Constructor method
{
    //this refers to object in which the method was called
    this.cost = cost;
    this.money = money;
}

//Returns the cost variable
public int getCost()
{
    return cost;
}

public void setCost(int cost)
{
    this.cost = cost;
}

//Returns the maximum amount
public int getMoney()
{
    return money;
}

public void setMoney(int Money)
{
    this.Money = Money;
}

}

私はJavaが初めてなので、どんな助けでも大歓迎です(:

4

3 に答える 3

2
import java.util.*;

public class M implements Comparator<M>{

int i,j;

M(int a, int b){
    i=a; j=b;
}

public int compare(M m1, M m2){

    return (m1.i-m2.i);
}

public boolean equals(Object o){
    if(this.i==((M)o).i)
        return true;
    else 
        return false;
}


public static void main(String args[]){

        M m1 = new M(2,1);
        M m2 = new M(3,2);
        M m3 = new M(1,3);

        ArrayList<M> a = new ArrayList<M>();
        a.add(m1);
        a.add(m2);
        a.add(m3);

                   Collections.sort(a,(Comparator<M>)m1);

                    //ArrayList a is sorted
            for(int j=0;j<a.size();j++){
        System.out.println(a.get(j).i);
    }
}
}

Collections.sort メソッドがクラス M の int1 を使用してオブジェクトをソートするように、Comparator インターフェイスをクラスに実装します。次に、Collections.sort メソッドを使用して配列をソートします。これは、質問の最初の部分に答える必要があります。

于 2013-01-02T06:34:43.383 に答える
1

これはどう :

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    M[] mm = new M[4];
    mm[0] = new M(11, 2);
    mm[1] = new M(11, 4);
    mm[2] = new M(4, 67);
    mm[3] = new M(4, 2);
    mm = compareM(mm);
    for (int a = 0; a < mm.length; a++) {
        System.out.println("index : "+a+" a : "+mm[a].a+" b : "+mm[a].b);
    }
}

public static M[] compareM(M[] data) {
    for (int a = 0; a < data.length - 1; a++) {
        for (int b = a + 1; b < data.length; b++) {
            if (data[a].a > data[b].a) {
                M temp = data[a];
                data[a] = data[b];
                data[b] = temp;
            }
        }
    }
    for (int a = 0; a < data.length; a++) {
        int indStart = a;
        int indEnd = a;
        for (int b = a + 1; b < data.length; b++) {
            if (data[b].a == data[a].a) {
                indEnd++;
            } else {
                b = data.length;
            }
        }
        a = indEnd;
        for (int c = indStart; c <= indEnd; c++) {
            for (int d = c + 1; d <= indEnd; d++) {
                if (data[c].b > data[d].b) {
                    M temp = data[c];
                    data[c] = data[d];
                    data[d] = temp;
                }
            }
        }
    }
    return data;
}

static class M {

    public int a, b;
    //u can have function to set value of a n b, or any function

    public M(int ax, int bx) {
        this.a = ax;
        this.b = bx;
    }
}

}

于 2013-01-02T05:39:17.233 に答える
1

Comparatorを作成するときは、ジェネリック型T( whereTは配列内のオブジェクトを表す) として使用する必要があるため、次のようになりますpublic int compare(T a, T b) { .. }

例えば:

new Comparator<M> {
    // Note the signature
    public int compare(M one, M two) 
    {
        // Now return a correct value based on the ordering
        // using one.getCost() and two.getCost()
        // Obviously "compareToIgnoreCase" is wrong for use with numbers.
        // Either work this out or see one of the existing/linked answers.
    }
}

ジェネリックが使用されていない場合は、シグネチャがpublic int compare(Object one, Object two)あり、キャストが必要になる可能性があります -のオーバーロードがない(int, int)ことに注意してください。これは、決して使用されない宣言済みメソッドです。

以下も参照してください。

于 2013-01-02T05:22:18.367 に答える