0

人のリストがあります。person Bean の構造は次のとおりです。

class Person {
    private String name;
    private String occupation;
    /* Getters and setters*/
    /* toString method */
}

このリストはArrayList<Person>. 問題は、そのデータを印刷すると、次のようになることです。

Foo, scientist
Foo, teacher
Bar, student

私はこのようにそれを印刷したい:

Foo, scientist, teacher
Bar, student

では、どうすればデータを自動的にグループ化できますか?

ありがとう。

4

6 に答える 6

2

きれいなライブラリを探しているなら、emaze-dysfunctionalで書くことができます

Groups.groupBy(persons, new Pluck<String, Person>(Person.class, "occupation"))

を取得しMap<String, List<Person>>ます。

于 2013-02-08T08:47:32.433 に答える
1

これはいくつかの方法で解決できます。私はおそらくMapオブジェクトを使用します

Map<String, List<String>> occupationsByName = new LinkedHashMap<String, List<String>>(0);

次に、名前をMapオブジェクトのキーとして使用し、キーが以前にMapに存在していなかった場合はいつでも、Listオブジェクトを初期化して、人物のリストをループします。

for ( Iterator<String> persons = personsList.iterator(); persons.hasNext() ) {
    String person = persons.next().getName();
    if ( occupationsByName.containsKey( person ) ) {
        occupationsByName.get( person ).add( person.getOccupation() );
    } else {
        occupationsByName.put(person, new ArrayList<String>(0) );
        occupationsByName.get( person ).add( person.getOccupation() );
    }
}

次に、各キーの下のリストに職業を追加し、最後にマップを印刷して終了します。

私はあなたがコレクションクラスの使い方を知っていると仮定していることを述べなければなりません、そしてあなたが知らなくてもあなたはJavaAPIを利用することができます

于 2013-02-08T09:00:40.930 に答える
0

名前は同じで職業が異なる2つのPersonインスタンスがあり、それらを同じ人物と見なす場合は、2つの名前が等しい場合は人の名前も等しいことをJVMに通知する必要があります。THatあなたはオーバーライドすることによって行いますequals()

次に、リストを更新して、リストPersonにすでに存在するを追加しようとすると(つまり、同じ名前の人がいる場合)、新しい職業を古い職業に追加します(たとえば、文字列の連結によって)。 )。

やりたいことのためのライブラリは必要ありません。完全なクラスを作成するだけです。:)

于 2013-02-08T08:38:07.663 に答える
0

このテストケースは合格です:

package com.sandbox;

import com.google.common.base.Joiner;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;

public class SandboxTest {

    @Test
    public void testQuestionInput() {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("Foo", "scientist"));
        persons.add(new Person("Foo", "teacher"));
        persons.add(new Person("Bar", "student"));
        String outputString = getOutputString(persons);
        assertEquals("Foo, scientist, teacher\n" +
                "Bar, student\n", outputString);
    }

    private String getOutputString(List<Person> in) {

        Multimap<String, String> map = LinkedListMultimap.create();
        for (Person person : in) {
            map.put(person.name, person.occupation);
        }

        StringBuilder buf = new StringBuilder();
        Joiner joiner = Joiner.on(", ");
        for (String key : map.keySet()) {
            buf.append(key).append(", ").append(joiner.join(map.get(key))).append("\n");
        }
        return buf.toString();
    }

    class Person {

        Person(String name, String occupation) {
            this.name = name;
            this.occupation = occupation;
        }

        private String name;
        private String occupation;
    /* Getters and setters*/
    /* toString method */
    }

}

Person のリストを受け取り、それらを Multimap に渡します。 Multimap は、Google guava ライブラリから取得されます。

ただし、maurocchi の回答を使用することをお勧めします。これよりずっときれいです。

于 2013-02-08T08:49:41.370 に答える
0

名前でデータをグループ化したい場合。次に、「コンパレータ」を使用します。

例:

Comparator comparator = new TestComparator();
Collections.sort(listTobeSorted, comparator);

これで、listTobeSorted に並べ替えられたリストが作成されます。したがって、必要に応じてデータを印刷できます。

// 新しい内部クラス

public class TestComparator implements Comparator<Person > {

    @Override
    public int compare(Person o1, Person o2) {
       //To write logic, Please refer the tutorial for Comparator
    }
}

これがあなたの問題に役立つことを願っています。

于 2013-02-08T08:53:27.513 に答える
0

あなたの質問から、同じ名前を共有するあなたのリストの人物は、実際には同じ人物であると思います。もしそうなら、あなたは本当にあなたのデータ編成について再考する必要があります. たとえば、人ごとに職業のリストを保存できます。

class Person {
    private String name;
    private final List<String> occupations = new ArrayList<String>();

    public boolean addOccupation(String occupation) {
        return occupations.add(occupation);
    }
    // getters
}

人を名前でグループ化するには、リストの代わりにマップを使用するのが最適です。次に、次のように単純な印刷メソッドを記述できます。

String personsToString(Map<String, Person> personMap) {
    StringBuilder sb = new StringBuilder();
    for (Person person: personMap.values())
        sb.append(person.getName()).append(", ").append(person.getOccupations()).append("\n");
    return sb.toString();
}
于 2013-02-08T08:58:47.723 に答える