2014-11-20 2 views
0

В настоящее время я пишу код, который содержит arraylist. Этот arraylist включает данные, которые являются именем, фамилией, заданием и идентификатором. Мне нужно разделить данные на разных аррайалистов. В настоящее время я использую метод, который показан ниже.Самый эффективный способ разделить данные arraylist на 4 отдельных arraylists?

for (int i = 0; i < details.size(); i = i + 4) { 
    names.add(details.get(i)); 
    lastname.add(details.get(i + 1)); 
    job.add(details.get(i + 2)); 
    id.add(details.get(i+3)); 
} 

Я хочу знать, есть ли лучший способ сделать это. Первоначальный arraylist может быть очень длинным, и я не знаю, есть ли какие-либо проблемы с этим методом.

+2

Это должно быть 'names.add (details.get (i));' – Braj

+1

Вы выходите из пределов. – Maroun

+3

Почему вы не используете объект 'Person', с свойствами' name', 'lastname',' job' и 'id'? –

ответ

0

Вы спросили: «Я хочу знать, есть ли лучший способ сделать это». Существует лучший способ.

IMHO, вы должны подумать о создании класса с именем Record, который содержит данные (имя, фамилия, задание и идентификатор) и создать ArrayList. Затем вместо использования указателей (и потенциально захватить неправильный элемент данных) вы можете использовать методы Get get, чтобы получить необходимый элемент данных (и, возможно, сохранить его в другом списке).

Шаг 1: Создать Record класс:

public class Record 
{ 
    private String firstName; 
    private String lastName; 
    private String job; 
    private String id; 

    // TODO add constructor(s), getters and setters 
} 

Шаг 2:. Создать список Records (это лучший вариант, что создать список, имеющий информацию в разных местах, индекс, который путь, каждый набор имен, фамилии, задания и идентификатора будет самодостаточным, который лучше, чем непересекающийся в разных местах индекса в списке.

ArrayList<Record> records = new ArrayList<Record>(); 

Шаг 3: Вместо того, чтобы использовать расположение индексов (и, возможно, захватить неправильный элемент данных), вы можете использовать методы Get get, чтобы получить необходимый элемент данных (и, возможно, сохранить его в другом списке).

ArrayList<String> names = new ArrayList<String>(); 
ArrayList<String> jobs = new ArrayList<String>(); 
... 
names.add(records.getLastName() + ", " + records.getFirstName()); 
jobs.add(records.getJob()); 

С другой стороны, и, возможно, лучшим решением, вы можете использовать Map для хранения этой информации. Например, идентификатор задания может быть ключом на Карте, который возвращает описание задания и кто был назначен для его выполнения. Идентификаторы заданий должны быть уникальными. Добавление идентификаторов в список может быть дублировано, поскольку интерфейс List не ограничивает ввод повторяющихся данных. Если вы используете карту, они гарантируют уникальность ключей.Значение, возвращаемое с Map, может быть объектом Record (или другим видом), который содержит имя человека и задание, за которое оно несет ответственность. Поскольку значения могут быть дублирующими, у вас может быть человек, выполняющий несколько заданий, что, вероятно, вы хотите сделать. Чтобы использовать Map:

Map<String, Record> jobs = new HashMap<String, Record>(); //This record class doesn't have ID in it. 
jobs.put("ABC123", new Record("John", "Doe", "Fix Drywall"); 
jobs.put("321CBA", new Record("Bill", "Smith", "Install Light Fixtures"); 

несколько вещей, чтобы рассмотреть при использовании Map. Если вы попытаетесь создать новую запись с существующим ключом, старый будет перезаписан.

jobs.put("ABC123", new Record("John", "Doe", "Fix Drywall"); 
jobs.put("ABC123", new Record("Bill", "Smith", "Install Light Fixtures"); //Overwrote the previous entry because key is the same 

Если вы хотите изменить ключ для существующего значения, вы должны получить значение, магазин временно удалить старую запись, и сделать новую запись со старым значением TEMP:

jobs.put("ABC123", new Record("John", "Doe", "Fix Drywall"); 
Record rec = jobs.remove("ABC123"); // gets the record and removes old entry 
jobs.put("321CBA", rec); // new job ID for old record 

Надеюсь, это поможет.

0

Основная проблема заключается в том, что в ваших данных могут отсутствовать данные. Например, он имеет размер = 5. Тогда ваш метод будет раздавлен с помощью IndexOutOfBounds. В вашем списке данных должен быть объект Person, который имеет все необходимые сведения, а затем просто использует их для заполнения других списков.

0

Главным результатом будет операция add, поскольку с течением времени ей придется расти структура данных. Так как вы знаете details.size(), вы должны инициализировать других arraylists details.size()/4.

Вы должны также проверить, что details.size() % 4 == 0 перед циклом for. Если это не означает, что ваши данные как-то не так, и вы наверняка будете работать в IndexOutOfBounds.

Для правильной работы вы должны написать i < details.size()+3 в качестве вашего условия, так как вы получите доступ к элементу i+3 в корпусе. Вы всегда должны следить за i < details.size()+x, если вы когда-либо обращались к i+x в теле. (для наибольшего x будет в корпусе)

Смежные вопросы