我有两个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());
}
我知道逻辑存在问题。刚刚迷路了。
答案 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);
如果您需要主要订单或排序结果,请使用LinkedMap,TreeMap或自行完成。