我对Java很新,我偶然发现了一个我无法理解的问题。首先让我解释一下我要做的事情,然后我将向您展示我到目前为止的代码。
我有一个webservice,它返回一个数组数组(包括公司和业务字符串行)。我希望将其转换为字符串列表,我在下面的第一行代码中做了。然后我希望遍历列表并且每次遇到公司的不同价值时,我想创建一个新的ArrayList并将相关的业务线添加到新列表中。 webservice的示例输出:80,80,64,64(这是预先设定的,因此相同的公司将始终组合在一起)相关的lobs将分别为1,2,3,4。我想要的是:arraylist [0]:1,2 arrayList [1]:3,4
到目前为止我所拥有的:
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);
}
}
}
}
我的问题是它没有将元素添加到新的字符串数组中。它确实循环通过coList,我把一个日志放在公司不相等的位置,所以我知道我需要在哪里创建一个新的arrayList,但我无法让它在我的生活中工作,请帮忙!
答案 0 :(得分:1)
听起来我觉得更好的选择是列表地图。让公司ID成为Map中的关键,并将该公司ID的每个新项目附加到值为List的列表中。
使用正确的工具完成工作。数组太低了。
答案 1 :(得分:1)
创建Map<String, List<Bussiness>>
每次检索公司名称时,首先检查密钥是否已在地图中。如果是,请检索列表并将Bussiness
对象添加到其中。如果不是,请在空List时插入新值并插入要评估的值。
答案 2 :(得分:1)
是的,你可以这样做,但用Java编写真的很烦人。注意:这在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);
}
}
}
输出:
[80, 80]
[60, 60]
当然,您可以执行其他人建议的操作,但这会更改您的数据类型。他们建议“适合工作的工具”,但他们没有提到番石榴Multimap。如果您决定将数据类型更改为地图,这将使您的生活更轻松。
以下是如何使用它的示例from this article:
public class MutliMapTest {
public static void main(String... args) {
Multimap<String, String> myMultimap = ArrayListMultimap.create();
// Adding some key/value
myMultimap.put("Fruits", "Bannana");
myMultimap.put("Fruits", "Apple");
myMultimap.put("Fruits", "Pear");
myMultimap.put("Vegetables", "Carrot");
// Getting the size
int size = myMultimap.size();
System.out.println(size); // 4
// Getting values
Collection<string> fruits = myMultimap.get("Fruits");
System.out.println(fruits); // [Bannana, Apple, Pear]
Collection<string> vegetables = myMultimap.get("Vegetables");
System.out.println(vegetables); // [Carrot]
// Iterating over entire Mutlimap
for(String value : myMultimap.values()) {
System.out.println(value);
}
// Removing a single value
myMultimap.remove("Fruits","Pear");
System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear]
// Remove all values for a key
myMultimap.removeAll("Fruits");
System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!)
}
}
答案 3 :(得分:0)
尝试使用foreach而不是
就像
一样foreach(列出listOfLists中的firstGroup) foreach(firstGroup中的字符串) ............
答案 4 :(得分:0)
感谢大家的投入! 我最终得到了一份清单:
import java.util。*;
import search.LOBList; public class arraySearch {
/**
* @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;
}
}
输出是: 搜索方法:80 搜索方法:80 搜索方法:80 当前列表的结尾 搜索方法:90 搜索方法:90 当前列表的结尾 搜索方法:100 当前列表的结尾
因此,公司:80的所有公司LOBList对象都被列在一个列表中,90和100也是如此。
答案 5 :(得分:0)
要遍历列表,您可以使用
ListIterator litr = coList.listIterator();
while(litr.hasNext()){
}