2013-08-14 2 views
0

У меня есть список массивов, который при заполнении имеет ключ и значение, которое я хочу знать, если есть способ его разделения на повторяющиеся ключи, например, мои текущие данные выглядят следующим образом:разделил список массивов на несколько списков в java

[RoleID_123.0, UserHandel_tom, Password_12345.0, prevPassword_null, userCaption_thomas, [email protected], RoleID_124.0, UserHandel_dave, Password_ghadf, prevPassword_sdfsd, userCaption_david, [email protected], RoleID_125.0, UserHandel_trevor, Password_tre, prevPassword_null, userCaption_trev, [email protected]] 

Я хочу, чтобы выйти больше, как это:

[RoleID_123.0, UserHandel_tom, Password_12345.0, prevPassword_null, userCaption_thomas, [email protected]] 

[RoleID_124.0, UserHandel_dave, Password_ghadf, prevPassword_sdfsd, userCaption_david, [email protected]] 

[RoleID_125.0, UserHandel_trevor, Password_tre, prevPassword_null, userCaption_trev, [email protected]] 

есть ли способ, чтобы разделить его на скажем роль идентификатора или я буду об этом неправильно?

+0

'subList' метод - ваш друг !!. –

+0

Вам просто нужно пройти через существующий список и создать новый список списков, используя критерии разбиения – shyam

+0

IMHO вместо преобразования этого списка вы должны сгенерировать правильный список в первый раз. Также каждый из ваших новых списков выглядит как объект, который заставляет меня думать, что вы действительно хотите, это список таких объектов. – m0skit0

ответ

1

Вы можете попробовать с помощью HashMap

private static class MyItemHashMap extends HashMap { 
    public Item add(Item item) { 
     get(item).add(item); 
     return item; 
    } 

    public List get(Item key) { 
     List list = (List) get(createItemKey((Item) key)); 
     return list == null ? createItemEntry((Item) key) : list; 
    } 

    private List createItemEntry(Item item) { 
     List list = new ArrayList(); 
     put(createItemKey(item), list); 
     return list; 
    } 

    private Object createItemKey(Item item) { 
     return item.getSplitterProperty(); 
    } 
    } 

    public static void main(String[] args) { 
    MyItemHashMap itemMapped = new MyItemHashMap(); 
    List items = Arrays.asList(new Object[]{new Item("A"), new Item("B"), 
    new Item("C")}); 
    for (Iterator iter = items.iterator(); iter.hasNext();) { 
    Item item = (Item) iter.next(); 
    itemMapped.add(item); 
    } 
    } 
1

Если это ArrayList, для разделения данных нет встроенной функции; вам придется делать это вручную. Если вы знаете количество последовательных полей, которые создают единую структуру, это не должно быть слишком сложным; что-то вроде этого:

// 6 because there are 6 fields 
for (int i = 0; i < arrayList.size(); i = i + 6) { 
    List thisList = arrayList.subList(i, i + 5); 
    // ... Now do whatever you want with thisList - it contains one structure. 
} 

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

0

Я хотел бы использовать HashMap, чтобы отделить данные вместо одного длинного ArrayList (вы не должны быть сохранены данные, как это в первую очередь)

HashMap<String,ArrayList<String>> hm = new HashMap<String,ArrayList<String>>; 

// For each list: 
    ArrayList<String> arr = new ArrayList<String>; 
    arr.add("each element"); 
    hm.put("RoleID_123.0", arr); 

Таким образом, вы будете в конечном итоге с трехмерную структуру с ключом («RoleID ...»), указывающую на его дочерние элементы.

0

Попробуйте

String[] str=new String[]{"RoleID_123.0", "UserHandel_tom", "Password_12345.0", "prevPassword_null", "userCaption_thomas", "[email protected]", "RoleID_124.0", "UserHandel_dave", "Password_ghadf", "prevPassword_sdfsd", "userCaption_david", "[email protected]", "RoleID_125.0", "UserHandel_trevor", "Password_tre", "prevPassword_null", "userCaption_trev", "[email protected]"}; 
List<String> list=new ArrayList<>(Arrays.asList(str)); 
List<String> subList=list.subList(0,5); 

Вы можете попробовать что-то подобное этому

0

Если вы чувствуете, как принимать подход Linq-е-е Libraried, это примерно так же хорош, как и для него, и для этого требуется использование нескольких делегатных объектов:

import static com.google.common.collect.Collections2.filter; 
import static com.google.common.collect.Collections2.transform; 
//... 


final List<String> yourList = //... 
final int RECORD_LENGTH = 6; 

Collection<String> roleIdValues = filter(yourList, new Predicate<String>() { 
    public boolean apply(@Nullable String input) { 
     return input != null && input.startsWith("RoleID"); 
    } 
}); 
Collection<Collection<String>> splitRecords = transform(roleIdValues, new Function<String, Collection<String>>() { 
    @Nullable public Collection<String> apply(@Nullable String input) { 
     return yourList.subList(yourList.indexOf(input), RECORD_LENGTH); 
    } 
}); 

Если Oracle предавал Java 8 по времени вы могли бы сделать это в образом более скользким усадебного. По иронии судьбы причина, по которой вы не можете получить те же самые люди, которые предоставляют библиотеку guava

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