Java 当值不同时,遍历数组列表并创建新的ArrayList,这是可能的吗?
我对Java相当陌生,我偶然发现了一个我一生都无法解决的问题。首先让我解释一下我正在尝试做什么,然后我将向您展示到目前为止我拥有的代码 我有一个Web服务,它返回数组数组(包括公司和业务线字符串)。我希望将其转换为字符串列表,这是我在下面的第一行代码中所做的。然后,我希望遍历该列表,每当我遇到不同的公司价值时,我都希望创建一个新的ArrayList,并将相关的业务线添加到新列表中。webservice的示例输出:80,80,64,64(这是预先排序的,因此相同的公司将始终分组在一起)关联的LOB将分别为1,2,3,4。我想要的:arraylist[0]:1,2 arraylist[1]:3,4 到目前为止,我所拥有的:Java 当值不同时,遍历数组列表并创建新的ArrayList,这是可能的吗?,java,arrays,sorting,arraylist,Java,Arrays,Sorting,Arraylist,我对Java相当陌生,我偶然发现了一个我一生都无法解决的问题。首先让我解释一下我正在尝试做什么,然后我将向您展示到目前为止我拥有的代码 我有一个Web服务,它返回数组数组(包括公司和业务线字符串)。我希望将其转换为字符串列表,这是我在下面的第一行代码中所做的。然后,我希望遍历该列表,每当我遇到不同的公司价值时,我都希望创建一个新的ArrayList,并将相关的业务线添加到新列表中。webservice的示例输出:80,80,64,64(这是预先排序的,因此相同的公司将始终分组在一起)关联的LOB
List coList = Arrays.asList(coArray);
//create list of lists
List<List<String>> listOfLists = new ArrayList<List<String>>();
String cmp = "";
for (int i=0;i<coList.size();i++){//loop over coList and find diff in companies
String currentCo = ((__LOBList)coList.get(i)).getCompany();
String currentLob = ((__LOBList)coList.get(i)).getLobNum();
if(i<coArray.length-1){
String nextCo = ((__LOBList)coList.get(i+1)).getCompany();
if((currentCo.equals(nextCo))){
//do nothing companies are equal
}else{
log("NOT EQUAL"); //insert logic to create a new array??
ArrayList<String> newList = new ArrayList<String>();
// for(int j=0;j<coList.size();j++){
newList.add( ((__LOBList)coList.get(i)).getLobNum());
// }
for(int k=0; k<listOfLists.size();k++){//loop over all lists
for(int l=0;l<listOfLists.get(k).size();l++){ //get first list and loop through
}
listOfLists.add(newList);
}
}
}
}
List coList=Arrays.asList(coArray);
//创建列表列表
List listOfLists=新建ArrayList();
字符串cmp=“”;
对于(int i=0;i我觉得更好的选择应该是列表映射。让公司ID作为映射中的键,并将该公司ID的每个新项附加到作为值的列表中
对作业使用正确的工具。数组的级别太低。创建一个Map
每次检索公司名称时,首先检查键是否已在映射中。如果已在映射中,则检索列表并向其添加business
对象。如果未在映射中,则在空列表中插入新值并插入正在计算的值。是的,您可以这样做,但用Java编写确实很烦人。注意:这是一个错误ead simple是一种函数式编程语言,如Clojure或Haskell。它只是一个名为group by
的函数。在java中,我是这样做的:
初始化列表的列表
创建一个last
指针,它是一个列表。它保存您添加到的最后一个列表
迭代原始数据并填充到最后一个数据中,只要“没有任何更改”。如果有更改,请创建一个新的last
我将演示如何:
package com.sandbox;
import java.util.ArrayList;
import java.util.List;
public class Sandbox {
public static void main(String[] args) {
ArrayList<String> rawInput = new ArrayList<String>();
rawInput.add("80");
rawInput.add("80");
rawInput.add("60");
rawInput.add("60");
new Sandbox().groupBy(rawInput);
}
public void groupBy(List<String> rawInput) {
List<List<String>> output = new ArrayList<>();
List<String> last = null;
for (String field : rawInput) {
if (last == null || !last.get(0).equals(field)) {
last = new ArrayList<String>();
last.add(field);
output.add(last);
} else {
last.add(field);
}
}
for (List<String> strings : output) {
System.out.println(strings);
}
}
}
当然,你可以按照其他人的建议做,但这会改变你的数据类型。他们建议“适合工作的工具”,但他们没有提到番石榴。如果你决定将数据类型更改为地图,这会让你的生活更轻松
下面是一个如何使用它的示例:
公共类MutliMapTest{
公共静态void main(字符串…参数){
Multimap myMultimap=ArrayListMultimap.create();
//添加一些键/值
myMultimap.put(“水果”、“班纳纳”);
myMultimap.put(“水果”、“苹果”);
myMultimap.put(“水果”、“梨”);
myMultimap.put(“蔬菜”、“胡萝卜”);
//得到尺寸
int size=myMultimap.size();
System.out.println(大小);//4
//获取价值
收集水果=myMultimap.get(“水果”);
System.out.println(水果);//[香蕉、苹果、梨]
收集蔬菜=myMultimap.get(“蔬菜”);
System.out.println(蔬菜);//[胡萝卜]
//在整个Mutlimap上迭代
for(字符串值:myMultimap.values()){
系统输出打印项次(值);
}
//删除单个值
myMultimap.移除(“水果”、“梨”);
System.out.println(myMultimap.get(“水果”);/[Bannana,Pear]
//删除键的所有值
myMultimap.removeAll(“水果”);
System.out.println(myMultimap.get(“水果”);//[](空集合!)
}
}
尝试使用foreach而不是for
就像
foreach(在ListofList中列出第一组)
foreach(第一组中的字符串s)
谢谢大家的支持!
最后我列出了一系列清单:
导入java.util.*
导入search.LOBList;
公共类数组搜索{
/**
* @param args
*/
public static void main(String[] args) {
LOBList test = new LOBList();
test.setCompany("80");
test.setLOB("106");
LOBList test1 = new LOBList();
test1.setCompany("80");
test1.setLOB("601");
LOBList test2 = new LOBList();
test2.setCompany("80");
test2.setLOB("602");
LOBList test3 = new LOBList();
test3.setCompany("90");
test3.setLOB("102");
LOBList test4 = new LOBList();
test4.setCompany("90");
test4.setLOB("102");
LOBList test5 = new LOBList();
test5.setCompany("100");
test5.setLOB("102");
LOBList BREAK = new LOBList();
BREAK.setCompany("BREAK");
BREAK.setLOB("BREAK");
BREAK.setcompany_lob("BREAK");
// create arraylist
ArrayList<LOBList> arlst=new ArrayList<LOBList>();
// populate the list
arlst.add(0,test);
arlst.add(1,test1);
arlst.add(2,test2);
arlst.add(3,test3);
arlst.add(4,test4);
arlst.add(5,test5);
//declare variables
int idx = 0;
String nextVal = "";
//loops through list returned from service, inserts 'BREAK' between different groups of companies
for(idx=0;idx<arlst.size();idx++){
String current = arlst.get(idx).getCompany();
if(idx != arlst.size()-1){
String next = arlst.get(idx+1).getCompany();
nextVal = next;
if(!(current.equals(next))){
arlst.add(idx+1,BREAK);
idx++;
}
}
}
//add last break at end of arrayList
arlst.add(arlst.size(),BREAK);
for(int i=0;i<arlst.size();i++){
System.out.println("co:" + arlst.get(i).getCompany());
}
//master array list
ArrayList<ArrayList<LOBList>> mymasterList=new ArrayList<ArrayList<LOBList>>();
mymasterList = searchListCreateNewLists(arlst);
//print log, prints all elements in all arrays
for(int i=0;i<mymasterList.size();i++){
for(int j=0;j<mymasterList.get(i).size();j++){
System.out.println("search method: " + mymasterList.get(i).get(j).getCompany());
}
System.out.println("end of current list");
}
}
//method to loop over company array, finds break, creates new array list for each company group,
//adds this to a list of lists(masterList)
public static ArrayList<ArrayList<LOBList>> searchListCreateNewLists(ArrayList<LOBList> list){
ArrayList<ArrayList<LOBList>> masterList=new ArrayList<ArrayList<LOBList>>();
int end = 0;
int start = 0;
int index = 0;
for(int i=0;i<list.size();i++){
if(list.get(i).getCompany().equals("BREAK")){
end = i;//end is current index
masterList.add(new ArrayList<LOBList>());
for(int j = start;j<end;j++){
masterList.get(index).add(list.get(j));
}
index++;
start = i+1;
}
}
return masterList;
}
/**
*@param args
*/
公共静态void main(字符串[]args){
LOBList测试=新建LOBList();
测试公司(“80”);
test.setLOB(“106”);
loblisttest1=新的LOBList();
测试1.setCompany(“80”);
test1.setLOB(“601”);
loblisttest2=新的LOBList();
测试2.setCompany(“80”);
test2.setLOB(“602”);
loblisttest3=新的LOBList();
测试3.设定公司(“90”);
test3.setLOB(“102”);
loblisttest4=新的LOBList();
测试4.setCompany(“90”);
test4.setLOB(“102”);
loblisttest5=新的LOBList();
测试5.设定公司(“100”);
test5.setLOB(“102”);
LOBList BREAK=新的LOBList();
BREAK.setCompany(“BREAK”);
BREAK.setLOB(“BREAK”);
BREAK.setcompany_lob(“BREAK”);
//创建arraylist
ArrayList arlst=新的ArrayList();
//填充列表
添加(0,测试);
arlst.add(1,test1);
arlst.add(2,test2);
arlst.add(3,test3);
arlst.add(4,test4);
arlst.add(5,test5);
//声明变量
int-idx=0;
字符串nextVal=“”;
//循环浏览服务返回的列表,在不同的公司组之间插入“BREAK”
用于(idx=0;idx遍历您可以使用的列表
ListIterator litr = coList.listIterator();
while(litr.hasNext()){
}
看起来这一行是你的罪魁祸首--newList.add(((((u)LOBList)coList.get(i)).getLobNum();我认为应该是newList.add((((u)LOBList)coList.get(i+1)).getLobNum();//请注意,我更新为i+1Awesome,感谢您的帮助!我甚至没有意识到存在多重映射,但这里有一个问题。如果我想将数据保存在类型u LOBList(它有几个字符串字段)中有没有办法用multimap做到这一点?我只是在想,如果我将公司作为关键,将业务线作为重点,我可能需要使用一些我将丢弃的信息values@Eric是的,Multimap.put
接受
。它可以是您想要的任何对象。@Eric我可能误解了。如果\uuuu LOBList
是值列表(而不是值),您必须实现自己的多映射
接口才能执行此操作
/**
* @param args
*/
public static void main(String[] args) {
LOBList test = new LOBList();
test.setCompany("80");
test.setLOB("106");
LOBList test1 = new LOBList();
test1.setCompany("80");
test1.setLOB("601");
LOBList test2 = new LOBList();
test2.setCompany("80");
test2.setLOB("602");
LOBList test3 = new LOBList();
test3.setCompany("90");
test3.setLOB("102");
LOBList test4 = new LOBList();
test4.setCompany("90");
test4.setLOB("102");
LOBList test5 = new LOBList();
test5.setCompany("100");
test5.setLOB("102");
LOBList BREAK = new LOBList();
BREAK.setCompany("BREAK");
BREAK.setLOB("BREAK");
BREAK.setcompany_lob("BREAK");
// create arraylist
ArrayList<LOBList> arlst=new ArrayList<LOBList>();
// populate the list
arlst.add(0,test);
arlst.add(1,test1);
arlst.add(2,test2);
arlst.add(3,test3);
arlst.add(4,test4);
arlst.add(5,test5);
//declare variables
int idx = 0;
String nextVal = "";
//loops through list returned from service, inserts 'BREAK' between different groups of companies
for(idx=0;idx<arlst.size();idx++){
String current = arlst.get(idx).getCompany();
if(idx != arlst.size()-1){
String next = arlst.get(idx+1).getCompany();
nextVal = next;
if(!(current.equals(next))){
arlst.add(idx+1,BREAK);
idx++;
}
}
}
//add last break at end of arrayList
arlst.add(arlst.size(),BREAK);
for(int i=0;i<arlst.size();i++){
System.out.println("co:" + arlst.get(i).getCompany());
}
//master array list
ArrayList<ArrayList<LOBList>> mymasterList=new ArrayList<ArrayList<LOBList>>();
mymasterList = searchListCreateNewLists(arlst);
//print log, prints all elements in all arrays
for(int i=0;i<mymasterList.size();i++){
for(int j=0;j<mymasterList.get(i).size();j++){
System.out.println("search method: " + mymasterList.get(i).get(j).getCompany());
}
System.out.println("end of current list");
}
}
//method to loop over company array, finds break, creates new array list for each company group,
//adds this to a list of lists(masterList)
public static ArrayList<ArrayList<LOBList>> searchListCreateNewLists(ArrayList<LOBList> list){
ArrayList<ArrayList<LOBList>> masterList=new ArrayList<ArrayList<LOBList>>();
int end = 0;
int start = 0;
int index = 0;
for(int i=0;i<list.size();i++){
if(list.get(i).getCompany().equals("BREAK")){
end = i;//end is current index
masterList.add(new ArrayList<LOBList>());
for(int j = start;j<end;j++){
masterList.get(index).add(list.get(j));
}
index++;
start = i+1;
}
}
return masterList;
}
ListIterator litr = coList.listIterator();
while(litr.hasNext()){
}