这是我能想到的最简单的方法。这个答案当然可以改进或以完全不同的方式完成。我采用这种方法是因为您提到您对Map 并不完全熟悉(我也在猜测Set)。无论如何,让我们潜入。
在您的AttendanceRecord 类中,您将需要以下实例变量:两个LinkedHashSet 和一个LinkedHashMap。 LinkedHashSet #1 将存储所有会议,LinkedHashSet #2 将存储所有参与者。 LinkedHashMap 会将会议存储为keys,将参与者list 存储为values。原因将在一分钟内清楚。我将首先解释为什么您需要LinkedHashSet。
LinkedHashSet 的用途
请注意,在您的二维数组中,行(会议)和列(参与者)按读取顺序排列。不仅如此,从文件中读取的所有重复项都消失了。为了保持顺序并消除重复,LinkedHashSet 非常适合这个目的。然后,我们将通过它们的数组表示在二维数组和每个LinkedHashSet 的行位置和列位置之间建立一对一的关系。例如,让我们使用来自ConferenceA 的Jhon。 Jhon 将位于与会者 Set 的数组表示中的位置 0,ConferenceA 将位于会议 Set 的数组表示中的位置 0。不仅如此,每个数组的大小都会用来决定你的二维数组的大小(2darray[conferenceArrayLength][participantArrayLength])
LinkedHashMap 的用途
我们需要LinkedHashMap 来保持元素的顺序(因此Linked)。元素将像这样在内部存储。
ConferenceA :Jhon Joe Mary
ConferenceB :Jhon Ted
ConferenceC :Jessica
然后我们将遍历数据结构并将每个 key value 对发送到一个函数,该函数返回每个 LinkedHashSet 返回的每个数组中每个元素的位置。当返回每一行和每一列的位置时,我们将在二维数组中的该位置添加一个 1。
注意:我在示例中使用了整数数组,根据需要替换。
AttendanceRecord.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);
}
}
}
Test.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;
}
}