3

タイプの .csv ファイルがあります。

Event                     Participant  
ConferenceA               John   
ConferenceA               Joe  
ConferenceA               Mary    
ConferenceB               John  
ConferenceB               Ted  
ConferenceC               Jessica  

次の形式の 2D ブール行列を作成したいと思います。

Event        John  Joe  Mary  Ted  Jessica  
ConferenceA  1     1    1     0    0  
ConferenceB  1     0    0     1    0  
ConferenceC  0     0    0     0    1  

まず、csv を読み取り、それを使用して次のタイプの ArrayList を初期化します。

AttendaceRecord(String title, String employee)

この ArrayList を繰り返し処理して、Java で上記のようなブール行列を作成するにはどうすればよいですか?

4

3 に答える 3

1

これは私があなたのために考えることができる最も簡単な方法です. この答えは確かに改善するか、まったく異なる方法で行うことができます。あなたが完全に精通していないと述べたので、私はこのアプローチを取っていますMap(私も推測していSetます)。とにかく潜りましょう。

クラスでは、AttendanceRecord次のインスタンス変数が必要になります: twoLinkedHashSetおよび one LinkedHashMapLinkedHashSet#1 はすべての会議を保存し、LinkedHashSet#2 はすべての参加者を保存します。は、会議を として、参加者リストを としてLinkedHashMap保存します。この理由はすぐにわかります。が必要な理由を最初に説明します。keysvaluesLinkedHashSet

LinkedHashSet の目的

2 次元配列では、行 (会議) と列 (参加者) が読み取られた順序で配置されていることに注意してください。それだけでなく、ファイルから読み取られたすべての重複がなくなります。順序を維持し、重複を排除するには、LinkedHashSetこの目的に完全に適合します。次に、2 次元配列の行位置と列位置の間に、それぞれLinkedHashSetの配列表現を介して 1 対 1 の関係を作成します。たとえばJhonfromを使ってみましょう。は、参加者の配列表現では位置0 になり、会議の配列表現では位置 0 になります。それだけでなく、各配列のサイズを使用して 2 次元配列のサイズを決定します (2darray[conferenceArrayLength][participantArrayLength])ConferenceAJhonSetConferenceASet

LinkedHashMap の目的

要素の順序を維持するには が必要ですLinkedHashMap(したがってLinked)。要素はこのように内部に格納されます。

ConferenceA :Jhon Joe Mary 
ConferenceB :Jhon Ted 
ConferenceC :Jessica 

次に、データ構造を繰り返し処理し、各key valueペアを関数に送信します。この関数は、 each から返された各配列の各要素の位置を返しますLinkedHashSet。各行と列の位置が返されると、2 次元配列のその位置に 1 が追加されます。

注:例では整数配列を使用しましたが、必要に応じて置き換えてください。

出席記録.java

public class AttendanceRecord {

    private Map<String, ArrayList> attendanceRecordMap = new LinkedHashMap<String, ArrayList>();
    private Set<String> participants = new LinkedHashSet<String>(); 
    private Set<String> conferences = new LinkedHashSet<String>(); 

    public AttendanceRecord() {
    }

    public Map<String, ArrayList> getAttendanceRecordMap() {
        return attendanceRecordMap;
    }

    public Object[] getParticipantsArray() {
        return participants.toArray();
    }

    public Object[] getConferencesArray() {

        return conferences.toArray();
    }

    public void addToRecord(String title, String employee) {

        conferences.add(title);
        participants.add(employee);

        if (attendanceRecordMap.containsKey(title)) {
            ArrayList<String> tempList = attendanceRecordMap.get(title);
            tempList.add(employee);
        } else {
            ArrayList<String> attendees = new ArrayList<String>();
            attendees.add(employee);
            attendanceRecordMap.put(title, attendees);
        }
    }
} 

テスト.java

public class Test {

    public static void main(String[] args) {

        AttendanceRecord attendanceRecord = new AttendanceRecord();

        //There are hardcoded. You will have to substitute with your code 
        //when you read the file
        attendanceRecord.addToRecord("ConferenceA", "Jhon");
        attendanceRecord.addToRecord("ConferenceA", "Joe");
        attendanceRecord.addToRecord("ConferenceA", "Mary");
        attendanceRecord.addToRecord("ConferenceB", "Jhon");
        attendanceRecord.addToRecord("ConferenceB", "Ted");
        attendanceRecord.addToRecord("ConferenceC", "Jessica");

        int[][] jaccardArray = new int[attendanceRecord.getConferencesArray().length][attendanceRecord.getParticipantsArray().length];
        setUp2dArray(jaccardArray, attendanceRecord);
        print2dArray(jaccardArray);
    }

    public static void setUp2dArray(int[][] jaccardArray, AttendanceRecord record) {
        Map<String, ArrayList> recordMap = record.getAttendanceRecordMap();

        for (String key : recordMap.keySet()) {
            ArrayList<String> attendees = recordMap.get(key);

            for (String attendee : attendees) {
                int row = findConferencePosition(key, record.getConferencesArray());
                int column = findParticipantPosition(attendee, record.getParticipantsArray());
                System.out.println("Row inside " + row + "Col inside " + column);
                jaccardArray[row][column] = 1;
            }
        }
    }

    public static void print2dArray(int[][] jaccardArray) {
        for (int i = 0; i < jaccardArray.length; i++) {
            for (int j = 0; j < jaccardArray[i].length; j++) {
                System.out.print(jaccardArray[i][j]);
            }
            System.out.println();
        }
    }

    public static int findParticipantPosition(String employee, Object[] participantArray) {
        int position = -1;

        for (int i = 0; i < participantArray.length; i++) {
            if (employee.equals(participantArray[i].toString())) {
                position = i;
                break;
            }
        }
        return position;
    }

    public static int findConferencePosition(String employee, Object[] conferenceArray) {
        int position = -1;

        for (int i = 0; i < conferenceArray.length; i++) {
            if (employee.equals(conferenceArray[i])) {
                position = i;
                break;
            }
        }
        return position;
    }
}
于 2013-07-11T23:36:16.180 に答える