4

従業員名、会社、年を含むカンマ区切りのファイルがあります。

従業員は複数の会社に所属している場合があります。

たとえば、

ジョン、グーグル、2
ジョン、マイクロソフト、1
ジェームズ、テスラ、1
ジェームズ、アップル、5

Javaスキャナーを使用して情報を取得しました

scanner.useDelimiter(",|\\n");
    while (scanner.hasNext()) {
        String line = scanner.next()

私はJavaが初めてで、リンクされたリストの配列または配列の配列を使用して、ソートされた順序で(ソート基準として経験を使用して)上記を挿入しようとしています。そう

従業員 -> 会社 1 -> 会社 2.... (従業員経験順)

したがって、上記の例では、次のようになります。

John->Microsoft->google
James->Tesla->Apple

誰かが私を正しい方向に向けることができますか?

注: 経験が同じであれば、どちらの会社が先でも構いません。

4

3 に答える 3

1

このクラスを Person に使用します

パブリック クラス Person {

@Getter @Setter
private String name;

@Getter @Setter
private TreeMap<String, String> companyExperience;

public Person(){
    companyExperience = new TreeMap<String, String>();
}

}

エクスペリエンスを TreeMap のキーとして使用すると、Person の会社が自動的に昇順で並べ替えられます。

メインクラスは次のようになります

public class App 
{
    public static void main( String[] args )
    {
        HashMap<String, Person> persons = new HashMap<String, Person>();

        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("C:\\Users\\Public Administrator\\test.txt"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String line = null;

        try {
            while ((line = br.readLine()) != null) {
                String[] fields = line.split(",");
                String personName = fields[0];
                Person existingPerson = persons.get(personName);
                if (existingPerson==null){
                    Person newPerson = new Person();
                    newPerson.setName(personName);
                    newPerson.getCompanyExperience().put(Integer.parseInt(fields[2])+fields[1], fields[1]);
                    persons.put(personName, newPerson);
                } else{
                    existingPerson.getCompanyExperience().put(Integer.parseInt(fields[2])+fields[1], fields[1]);
                }
             }
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    

        //output
        Iterator<Map.Entry<String, Person>> entries = persons.entrySet().iterator();
        while (entries.hasNext()) {
            Map.Entry<String, Person> entry = entries.next();
            Person _person = entry.getValue();
            System.out.print(_person.getName());

            Iterator<Map.Entry<String, String>> companyExperiences = _person.getCompanyExperience().entrySet().iterator();
            while (companyExperiences.hasNext()) {
                Map.Entry<String, String> companyExperience = companyExperiences.next();

                System.out.print(" > "+companyExperience.getValue());
            }
            System.out.println();

        }
    }
}

私はそれをテストしましたが、私にはかなり、かなり良いように見えます.

ちなみに、@Getter および @Setter アノテーションは Lombok プロジェクトのものです。それを使用することも、独自のゲッター/セッターを作成することもできます。

于 2013-02-13T10:58:45.217 に答える
0

ファイルを読み取り、readLine()split を使用してデータの各フィールドを取得します。例:

BufferedReader br = new BufferedReader(new FileReader("FileName"));
String line = null;
ArrayList<Person> list = new ArrayList<Person>();

while ((line = br.readLine()) != null) {
    String[] fields = line.split(",");
    list.add(new Person(fields[0], fields[1], Integer.parseInt(fields[2])));
 } 

次に、個人の情報を保存し、ソートロジックを実行する場所を実装するなどArrayList、カスタムクラスを取るデータを保存できます。PersonComparable

個人名でデータをグループ化する必要がある場合Hashtableは、キーが個人名で、値がArrayList経験値である場合を検討してください。

データのクラスを定義できます。

class Person implements Comparable<Person> {
    private String name;
    private String company;
    private int experience;

    public Person(String name, String company, int experience) {

        this.name = name;
        this.company = company;
        this.experience = experience;
    }

    public int getExperience() {
        return experience;
    }

    @Override
    public int compareTo(Person person) {
        return new Integer(experience).compareTo(person.getExperience());
    }
}

Collections.sort(list);リストをソートするには、 ;を呼び出すだけです。ただし、このリストにはすべてのデータが含まれるため、コードを変更してデータを従業員名でグループ化し、従業員ごとにリストを作成します。

于 2013-02-13T01:14:44.307 に答える
0

あなたの目的のために、ある程度の経験を持つ人物を表すオブジェクトが本当に必要なように思えます。入力ソースには非正規化されたデータがあるため、これを行う最も簡単な方法はMap<String,Person>、ファイルを解析するときにa を入力することです。

scanner.useDelimiter(",|\\n");
while (scanner.hasNext()) {
    String line = scanner.next();
    String[] fields = line.split(",");

    String name = fields[0];
    Person person = map.get(name);
    if (person == null) {
        person = new Person(name);
        map.put(name, person);
    }
    person.addJob(fields[1], Integer.parseInt(fields[2]));
}

List<Person> people = new ArrayList<Person>(map.values());

このプロセスの後、順不同で人のリストが作成されます。Person ごとに、ジョブを経験順にソートしたいので、順序Person.addJobを維持するように実装する必要があります。SortedSetはこれを行うための非常に優れた方法ですが、重複を挿入することはできません。また、経験で並べ替えたい場合、ある人が 2 つの仕事に同じ時間従事している可能性があるため、別のアプローチを使用する必要があります。 . これを行うにはいくつかの方法がありますが、データについて仮定をせずに、並べ替えられたオブジェクトを保持することをお勧めしListますJob

class Person {
    private final List<Job> jobs = new LinkedList<Job>();

    // Constructor, etc... 

    public void addJob(String companyName, int yearsOfExperience) {
        Job newJob = new Job(companyName, yearsOfExperience);
        int insertionIndex = Collections.binarySearch(jobs, newJob);
        if (insertionIndex < 0) {
            insertionIndex = (-(insertionIndex) - 1);
        }
        jobs.add(insertionIndex, newJob);
    }
}

そして最後に、あなたがそれを調べることができるように、 aJobを実装する必要があります:Comparable<Job>

class Job implements Comparable<Job> {
    private final String companyName;
    private final int yearsOfExperience;

    // Constructor, etc... 

    public int compareTo(Job otherJob) {
        return Integer.compare(yearsOfExperience,otherJob.yearsOfExperience);
    }
}

その少しの策略により、ジョブの「自然な順序」によって常にソートされPerson.addJobます。( Collections.binarySearchを参照)。List

于 2013-02-13T03:43:03.660 に答える