3

Java で特定の問題を解決するのに問題があります (検索では見つかりませんでした)。オブジェクトのネストされたリストを作成する方法がわかりません - 最後に異なるタイプのオブジェクト/プリミティブタイプがあります。例えば:

注:一例です。私は実際に以下でこれを従業員以外で行っていますが、簡単な例として役立ちます。

オブジェクト Employee の配列があります。従業員に関する情報が含まれています。

public class Employee {
    int age
    int salary
    int yearsWorking
    public Employee () {
        // constructor...
    }
    // Accessors
}

私がする必要があるのは、従業員を分位/パーセンタイルで整理することです。私は次のようにしました:

import org.apache.commons.math.stat.descriptive.rank.Percentile;
public class EmployeeSort {
    public void main(String args[]) {
        Percentile p = new Percentile();
        Employee[] employeeArray = new Employee[100];
        // filled employeeArray
        double[] ageArray = new double[100];
        // filled ageArray with ages from employeeArray
        int q = 25; // Percentile cutoff
        for (int i = 1; i*q < 100; i++) {
            // assign percentile cutoff to some array to contain the values
        }
    }
}

さて、私が抱えている問題は、従業員を最初に年齢のパーセンタイルで整理し、次に勤続年数のパーセンタイルで整理し、最後に給与のパーセンタイルで整理する必要があることです。この問題を解決するには、現時点で私の Java の知識が不十分ですが、私が渡されたプロジェクトは Java でした。私は主に python 派なので、この問題はその言語の方がはるかに簡単だったでしょう。そのような幸運はありません。

編集:注文が必要かどうかについて混乱があり、Comparatorの使用を提案している人もいます。パーセンタイルには順序付けられたリストが必要なため、Comparator を使用します。私が抱えている問題は、従業員のビニングを適切なパーセンタイルに格納する方法です。明確にするために、年齢ごとに適切なパーセンタイルにまとめられた Employee オブジェクトが必要です。次に、その年齢のビン内で、すべての Employee オブジェクトを Employee.yearsWorking のパーセンタイル内にビン化する必要があります。それに続いて、Employee.age の特定のパーセンタイル ビン内にある yearWorking の特定のパーセンタイル ビン内で、Employee.salary のパーセンタイル ビンを作成する必要があります。

4

5 に答える 5

2

Arrays の代わりにArrayListを使用する必要があります。

ArrayList<Employee> employeeList= new ArrayList<Employee>();

for (int i = 0, i <= employeeArray.length; i++)
    employeeList.add(employeeArray[i]);

ここで、カスタムComparatorを書き留めます

public class EmployeeComparatorByAge<Employee>
{
    public int compare(Object o1, Object o2)
    {
        if (o1 != null && o2!= null && o1 instanceof Employee && o2 instanceof Employee )
            return ((Employee)o1).age - ((Employee)o2).age;
        else
            return -1;
    }
}

同様に、他の比較についても書くことができます。

それらを今すぐソートするには、次を使用します。

Collections.sort(employeeList, new EmployeeComparatorByAge<Employee>());

これで問題は解決します。

于 2012-07-05T15:31:06.517 に答える
0

java.util.Comparator <T>を確認してください(この場合のTは従業員タイプになります)

さまざまなコンパレータを作成し、Collections.sortListまたはArrays.sort(...)を使用できます(これらのメソッドは疑似メソッドです。ドキュメントから正確なバージョンを検索してください)

于 2012-07-05T15:11:44.033 に答える
0

上記のように、さまざまな Comparator 実装で Arrays.sort() を使用します。このメソッド (および Collections.sort()) は、その場でデータを操作することに注意してください。したがって、データのさまざまなビューを取得し続ける必要がある場合は、配列を複製して別の方法で並べ替え、各ビューを保持することができます。

これは、配列を常に再ソートするよりも (CPU に関して) 効率的です。

于 2012-07-05T17:20:18.930 に答える
0

配列の代わりに an を使用しArrayListて Employees を保持します。その後、 を使用Collections.sort()してそのリストを並べ替えることができます。sort() には 2 つのバージョンがあり、そのうちの 1 つはComparator、希望する順序で並べ替えることができる を受け取ります。

于 2012-07-05T15:12:35.777 に答える
0

このリンクを読んで、Java でのオブジェクトの順序付けを理解することをお勧めします。

次にやりたいことは、ArrayList を使用して、これにすべての従業員を追加することです。次に、次のようなことをしたいと思うでしょう:

ArrayList<Employee> employeeList= new ArrayList<Employee>();
/**
  * Add your employee objects to the list
  */


Collections.sort(contacts, new Comparator<Employee>() {
    public int compare(Employee emp1, Employee emp2) {
        int returnValue;
        /**
         * Your comparison logic
         */

        return returnValue;
    }
}); 

これが役立つことを願っています!

于 2012-07-05T15:13:43.837 に答える