比较两个arrayLists以匹配后处理条件

时间:2017-06-13 10:16:14

标签: java arraylist

我有两个arraylists

ArrayList A ArrayList B
London      001
Berlin      001
Frankfurt   450
Rome        001
Geneva      230
Lille       620

我试图打印的内容如下: 如果,arraylist中的代码不相等,则向其添加单独的XML标记。如果他们是平等的,那就把他们打成一个标签。

E.g

<001> London Berlin </001> <450> Frankfurt </450> <001> Rome </001> <230> Geneva </230> <620> Lille </620>

以下是我使用的逻辑

List<String> newList = new ArrayList<String>();

        for(int i= 0; i< ListA.size(); i++){            
            if(i >=1){              
                String temp = ListB.get(i-1);               
                if(temp.contentEquals(ListB.get(i)))
                {                   
                    newList.add(ListA.get(i));                  
                }
                else{                   
                    newList.add("<"+ ListB.get(i) +"> " + ListA.get(i) + " </"+ ListB.get(i) +">" );
                }   
            }
            else{   
             /*if i=0*/
             newList.add("<"+ ListB.get(i) +"> " + ListA.get(i) + " </"+ ListB.get(i) +">" );
            }       

        }       

        StringJoiner outputText = new StringJoiner(" ");
        for(int i=0; i< newList.size();i++){
            outputText.add(newList.get(i));         
        }

        System.out.println(outputText.toString());
    }

我知道逻辑存在问题。刚刚迷路了。

5 个答案:

答案 0 :(得分:3)

你的逻辑错了,试试这个:

for (int i = 0; i < ListA.size(); i++) {
        if (i == 0) {
            newList.add("<" + ListB.get(i) + "> " + ListA.get(i) + " ");
        }
        if (i >= 1) {
            String temp = ListB.get(i - 1);
            if (temp.equals(ListB.get(i))) {
                newList.add(ListA.get(i));
            } else {
                newList.add("</" + ListB.get(i - 1) + ">" + " <" + ListB.get(i) + "> " + ListA.get(i) + " ");
            }
        }
        if (i == ListA.size() - 1) {
            newList.add("</" + ListB.get(i) + ">");
        }
    }

通过使用此逻辑,您将获得所需的输出

答案 1 :(得分:2)

见下文:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MultipleLists {

    public static void main(String[] args) {


//        London      001
//        Berlin      001
//        Frankfurt   450
//        Rome        001
//        Geneva      230
//        Lille       620



        List<String> cities = Arrays.asList("London", "Berlin", "Frankfurt", "Rome", "Geneva", "Lille");
        List<String> codes = Arrays.asList("001", "001", "450", "001", "230", "620");


        List<CityCode> cityCodes = new ArrayList<>();
        for (int i = 0; i < cities.size(); i++) {
            cityCodes.add(new CityCode(cities.get(i), codes.get(i)));
        }

        StringBuffer stringBuffer = new StringBuffer();
        Collections.sort(codes);
        Set<String> codesSet = new HashSet<>(codes);

        for (String code : codesSet) {
            stringBuffer.append("<" + code + ">");

            for (CityCode cityCode : cityCodes) {
                if (cityCode.getCode().compareTo(code) == 0) {
                    stringBuffer.append(cityCode.getName());
                    stringBuffer.append(" ");
                }
            }
            stringBuffer.append("</" + code + ">");
        }

        System.out.println(stringBuffer);  // <001>London Berlin Rome </001><620>Lille </620><230>Geneva </230><450>Frankfurt </450>

    }
}

class CityCode {
    private String name;
    private String code;

    public CityCode(String name, String code) {
        this.name = name;
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public String getCode() {
        return code;
    }
}

答案 2 :(得分:1)

您需要进行微小更改,即以不同方式添加结束标记。其他代码保持不变。

List<String> newList = new ArrayList<String>();

        for(int i= 0; i< ListA.size(); i++){            
            if(i >=1){              
                String temp = ListB.get(i-1);               
                if(temp.contentEquals(ListB.get(i)))
                {                   
                    newList.add(ListA.get(i));                
                }else{    
                    newList.add(" </"+ ListB.get(i-1) +">" )               
                    newList.add("<"+ ListB.get(i) +"> " + ListA.get(i) );
                }   

            }else{   
             /*if i=0*/
             newList.add("<"+ ListB.get(i) +"> " + ListA.get(i) + );
            }  
            if(i==ListA.size()-1){
                newList.add(" </"+ ListB.get(i-1) +">" 
            }      

        }       

        StringJoiner outputText = new StringJoiner(" ");
        for(int i=0; i< newList.size();i++){
            outputText.add(newList.get(i));         
        }

        System.out.println(outputText.toString());
    }

希望它有所帮助。

答案 3 :(得分:0)

这样的东西?

public static void main(String[] args) {

        List<String> cities = Arrays.asList("London", "Berlin", "Frankfurt", "Rome", "Geneva", "Lille");
        List<String> codes = Arrays.asList("001", "001", "450", "001", "230", "620");

        Map<String, List<String>> result = new HashMap<>();
        for (int i = 0; i < cities.size(); i++) {
            String city = cities.get(i);
            String code = codes.get(i);

            if (result.containsKey(code)) {
                List<String> list = result.get(code);
                list.add(city);
            } else {
                ArrayList<String> mappedCities = new ArrayList<>();
                mappedCities.add(city);
                result.put(code, mappedCities);
            }
        }

        String fullXml = result.entrySet().stream().parallel().map(entry -> {
            String tag = entry.getKey();
            List<String> vals = entry.getValue();
            String citiesSeparated = vals.stream().collect(Collectors.joining(" "));
            return xmlStart(tag) + citiesSeparated + xmlEnd(tag);
        }).collect(Collectors.joining(" "));

        System.out.println(fullXml);
    }

    private static String xmlEnd(String s) {
        return "<" + s + "/>";
    }

    private static String xmlStart(String s) {
        return "<" + s + ">";
    }

答案 4 :(得分:0)

首先:拥有两个断开连接的列表并不是一个好主意(非常糟糕的主意)。 您高度依赖于代码和城市的位置。也许你可以重新考虑使用地图代替?这会容易得多。

第二:似乎你错过了代码中的一个要求。 &#34;如果代码等于之前的城市代码,则在一个标签中加入城市&#34; 这是真的吗?为什么&#34;罗马&#34;代码001与&#34;伦敦柏林&#34;?

分开标记

第三:当然,何答的回答是正确的OO回答,我个人更喜欢。

Forth:BTW如果&#34;罗马&#34;必须与&#34;伦敦柏林&#34;你可以简单地使用像:

这样的地图
    Map<String,String> codeCityMap = new TreeMap<String,String>();

    for (int i=0;i <arrayListA.size();i++)
    {
        String cities = codeCityMap.get(arrayListB.get(i));
        cities = null == cities?arrayListA.get(i):cities + " " + arrayListA.get(i);
        codeCityMap.put(arrayListB.get(i), cities);                 
    }

    List<String> newList = new ArrayList<String>();

    for (String code: codeCityMap.keySet())
    {
        newList.add("<" + code + ">" + codeCityMap.get(code) + "</" + code + ">");
    }

如果&#34;罗马&#34;不能是你可以使用相同的技术,但引入一些额外的代码来检查行cities = null == cities?arrayListA.get(i):cities + " " + arrayListA.get(i);

中前面的citiy代码是否相等

如果您需要主要订单或排序结果,请使用LinkedMap,TreeMap或自行完成。