Это самый простой способ Я могу думать о тебе. Этот ответ, безусловно, может быть улучшен или выполнен совершенно по-другому. Я придерживаюсь такого подхода, потому что вы упомянули, что вы не совсем знакомы с Map
(я также догадываюсь Set
). В любом случае давайте погрузимся.
В вашем классе AttendanceRecord
вам понадобятся следующие переменные экземпляра: два LinkedHashSet
и один LinkedHashMap
.LinkedHashSet
# 1 будет хранить все конференции, а LinkedHashSet
# 2 будет хранить всех участников. LinkedHashMap
будет хранить конференции в качестве keys
и участников list as values
. Причина этого будет понятна через минуту. Сначала объясню, зачем вам нужен LinkedHashSet
.
Цель LinkedHashSet
Обратите внимание, в вашем 2d массив строк (конференции) и колонны (участников) расположены в порядке их читать. Не только это, все дубликаты, прочитанные из файла, исчезли. Для сохранения порядка и устранения дубликатов LinkedHashSet
идеально подходит для этой цели. Затем мы будем иметь отношение «один к одному» между позициями строк и позициями столбцов массива 2d и каждый LinkedHashSet
через их представление массива. Давайте используем Jhon
от ConferenceA
, например. Jhon
будет в позиции 0 в представлении массива участника Set
и ConferenceA
будет в позиции 0 в представлении массива конференции Set
. Мало того, что размер каждого массива будет использоваться для определения размера вашего 2d массива (2darray [conferenceArrayLength] [participantArrayLength])
Цели в LinkedHashMap
Нам нужно LinkedHashMap
, чтобы сохранить упорядочение элементов (следовательно, Linked
). Элементы будут храниться внутри, как это.
ConferenceA :Jhon Joe Mary
ConferenceB :Jhon Ted
ConferenceC :Jessica
Затем мы итерацию по структуре данных и отправить каждый key
value
пару с функцией, которая возвращает позицию каждого элемента из каждого массива, возвращенный от каждого LinkedHashSet
. По мере возврата каждой позиции строки и столбца мы добавим 1 в эту позицию в массив 2d.
Примечание: Я использовал массив Integer для моего примера, при необходимости замените.
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;
}
}
Этот CSV может иметь любое количество конференций и/или участников? – Andy
Вставляя это в свой ArrayList, поддерживаете ли вы другие переменные, например, сколько разных сотрудников или событий у вас есть? –
Почему бы просто не использовать «карту»? Ключами будут конференции, и значения будут участниками? Должен ли он быть «ArrayList»? Это будет намного проще для вас. – Andy