0

我有一个数组列表,当填充它时有一个键和一个值,我想知道是否有一种方法可以在重复键上拆分它,例如我当前的数据是这样的:

[RoleID_123.0, UserHandel_tom, Password_12345.0, prevPassword_null, userCaption_thomas, Email_tom@tom.tom, RoleID_124.0, UserHandel_dave, Password_ghadf, prevPassword_sdfsd, userCaption_david, Email_dave@dave.dave, RoleID_125.0, UserHandel_trevor, Password_tre, prevPassword_null, userCaption_trev, Email_trev@trev.trev]

我希望它更像这样:

[RoleID_123.0, UserHandel_tom, Password_12345.0, prevPassword_null, userCaption_thomas, Email_tom@tom.tom]

[RoleID_124.0, UserHandel_dave, Password_ghadf, prevPassword_sdfsd, userCaption_david, Email_dave@dave.dave]

[RoleID_125.0, UserHandel_trevor, Password_tre, prevPassword_null, userCaption_trev, Email_trev@trev.trev]

有没有办法在说角色ID上拆分它,或者我是否以错误的方式解决这个问题?

4

5 回答 5

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字段。

于 2013-08-14T10:53:18.547 回答
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);  
     }  
     }  
于 2013-08-14T10:57:45.187 回答
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...”)的三维结构。

于 2013-08-14T10:56:06.170 回答
0

试试这个

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

你可以尝试类似的东西

于 2013-08-14T10:59:41.813 回答
0

如果您想采用 Linq-ee 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);
    }
});

如果甲骨文按时交付了Java 8 ,那么您将能够以一种更巧妙的方式来完成这项工作。具有讽刺意味的是,提供番石榴库的同一个人提供了您无法提供的原因

于 2013-08-14T11:46:31.430 回答