[英]adding 2 arraylists to another arraylist
我有2這樣的arraylist,但我不確定如何將它們組合在一起。 我已經嘗試過Collections.copy()和addAll方法,但是它無法正常工作,我想知道是否有任何方法可以將它們組合在一起成為另一個arraylist? 我真正想要的是讓第一個arraylist存儲來自第二個arraylist的數據,因此每個Point里面都有幾行。 謝謝你們,也許你們可以給我一些建議。
static ArrayList<Vertex> getPoints() {
Scanner input = Reader(Vertex.airports);
ArrayList<Vertex> result = new ArrayList<Vertex>();
while(input.hasNext()){
String point = input.nextLine();
result.add(new Vertex(point));
}
input.close();
return result;
}
static ArrayList<Edge> getlines(){
Scanner input = Reader(Vertex.graph);
ArrayList<Edge> result = new ArrayList<Edge>();
while(input.hasNext()){
String route = input.nextLine();
result.add(new Edge(route));
}
input.close();
return result;
}
數據來自2個文本文件,該文件如下所示。 它們只是為了展示我在這里想要做什么。 (索引,名稱)
1 England
2 France
(索引,開始,費用,結束)
1 1 2 2
2 1 3 1
3 1 6 3
4 1 7 3
5 2 1 2
6 2 3 1
7 2 4 1
8 2 5 2
9 2 6 2
10 3 1 1
11 3 2 1
12 3 4 1
13 3 8 1
14 3 10 2
多虧福特上尉完成了!
好的,我的理解是,第一個列表包含機場列表,第二個列表連接第一個列表中的機場。
如果要存儲對具有關聯點的線的引用,則需要圍繞包含另一個列表的點創建包裝。
class Airport {
public Vertex point;
public List<Edge> routes = new ArrayList<Edge>();
public Airport(Vertex p){
this.point = p;
}
}
然后,當您加載列表時,您將執行以下操作:
static ArrayList<Airport> getAirports() {
Scanner input = Reader(Vertex.airports);
ArrayList<Vertex> result = new ArrayList<Vertex>();
while(input.hasNext()){
String point = input.nextLine();
// Note the small change on the next line
result.add(new Airport(new Vertex(point)));
}
input.close();
return result;
}
static ArrayList<Edge> getlines(){
Scanner input = Reader(Vertex.graph);
ArrayList<Edge> result = new ArrayList<Edge>();
while(input.hasNext()){
String route = input.nextLine();
result.add(new Edge(route));
}
input.close();
return result;
}
static void combineLists(List<Airport> airports, List<Edge> lines){
for(Edge edge : lines){
// This is where we add the routes to both airports
// Since I don't know the structure of the edge class, I'm making a guess that you're using the integer indices that were described in the file to describe the endpoints. Note, however, that you will need to find a way to guarantee that they match the indices of the list of airports.
airports.get(edge.p1).routes.add(edge);
airports.get(edge.p2).routes.add(edge);
}
}
我認為我可以改善其他答案。
更完整的解決方案如下所示:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Airport {
public final int id;
public String name;
public List<Route> outboundRoutes = new ArrayList<Route>();
public List<Route> inboundRoutes = new ArrayList<Route>();
public double minDistance;
public Airport previous;
public Airport(int id, String name){
this.id = id;
this.name = name;
}
public static class Route {
public final int id;
public double cost;
public Airport departure;
public Airport destination;
public Route(int id, double cost, Airport departure, Airport destination){
this.id = id;
this.cost = cost;
this.departure = departure;
this.destination = destination;
}
}
public static Map<Integer,Airport> readAirports(Scanner input){
Map<Integer,Airport> airports = new HashMap<Integer,Airport>();
while(input.hasNext()){
// Using a map rather than a list simplifies the process of loading
// your routes, and eliminates problems that would crop up if some
// airports are listed out of order or removed.
Airport port = new Airport(input.nextInt(), input.next());
airports.put(port.id, port);
}
return airports;
}
// Note that the list of airports must be passed when loading the routes,
// but that nothing is returned -- the routes are loaded directly
// into the airports.
public static void readRoutes(Scanner input, Map<Integer,Airport> airports){
while(input.hasNext()){
int id = input.nextInt();
int departureId = input.nextInt();
int destinationId = input.nextInt();
double cost = input.nextDouble();
if(!(airports.containsKey(departureId) &&
airports.containsKey(destinationId))){
// You'll have to decide how to handle a situation when a route
// refers to airports that don't exist
throw new RuntimeException(
"Undefined airport referenced in route #" + id);
}
Route route = new Route(id, cost, airports.get(departureId),
airports.get(destinationId));
route.departure.outboundRoutes.add(route);
route.destination.inboundRoutes.add(route);
}
}
public static Map<Integer,Airport> loadAirports() throws FileNotFoundException {
Scanner inAirports = new Scanner(new File("airports.txt"));
Scanner inRoutes = new Scanner(new File("routes.txt"));
Map<Integer,Airport> airports = readAirports(inAirports);
readRoutes(inRoutes, airports);
return airports;
}
public static void main(String[] args){
try {
Map<Integer,Airport> airports = loadAirports();
for(Airport port : airports.values()){
System.out.println(port.name + " has " + port.inboundRoutes.size() + " inbound routes and " + port.outboundRoutes.size() + " outbound routes ");
for(Route r : port.inboundRoutes){
System.out.println("\tin from " + r.departure.name + " at a cost of $" + r.cost);
}
for(Route r : port.outboundRoutes){
System.out.println("\tout to " + r.destination.name + " at a cost of $" + r.cost);
}
}
} catch (IOException e){
e.printStackTrace();
}
}
}
如果您想要一個簡單,簡單的答案,那么不進行某種嵌套就無法完成對ArrayList的處理。
由於您正在使用具有ID的數據,因此強烈建議您始終使用HashMap,這樣您就不必擔心數據排列不正確。 並且由於您具有元數據(機場名稱),因此創建這些類是對數據進行建模的好方法。
編輯:現在,代碼已更改為完全適合一個文件。 使用您提供的分別名為“ airports.txt”和“ routes.txt”的示例文件,它應該可以正常工作。 運行它時,應該獲得以下輸出:
England(LHR) has 4 inbound routes and 4 outbound routes
in from France(CDG) at a cost of $2.0
in from Holland(AMS) at a cost of $1.0
in from Portugal(LIS) at a cost of $3.0
in from Iceland(KEF) at a cost of $3.0
out to France(CDG) at a cost of $2.0
out to Holland(AMS) at a cost of $1.0
out to Portugal(LIS) at a cost of $3.0
out to Iceland(KEF) at a cost of $3.0
France(CDG) has 5 inbound routes and 5 outbound routes
in from England(LHR) at a cost of $2.0
in from Holland(AMS) at a cost of $1.0
in from Germany(FRA) at a cost of $1.0
in from Italy(LIN) at a cost of $2.0
in from Portugal(LIS) at a cost of $2.0
out to England(LHR) at a cost of $2.0
out to Holland(AMS) at a cost of $1.0
out to Germany(FRA) at a cost of $1.0
out to Italy(LIN) at a cost of $2.0
out to Portugal(LIS) at a cost of $2.0
Holland(AMS) has 5 inbound routes and 5 outbound routes
in from England(LHR) at a cost of $1.0
in from France(CDG) at a cost of $1.0
in from Germany(FRA) at a cost of $1.0
in from Denmark(CPH) at a cost of $1.0
in from Finland(HEL) at a cost of $2.0
out to England(LHR) at a cost of $1.0
out to France(CDG) at a cost of $1.0
out to Germany(FRA) at a cost of $1.0
out to Denmark(CPH) at a cost of $1.0
out to Finland(HEL) at a cost of $2.0
Germany(FRA) has 4 inbound routes and 4 outbound routes
in from France(CDG) at a cost of $1.0
in from Holland(AMS) at a cost of $1.0
in from Italy(LIN) at a cost of $1.0
in from Sweden(ARN) at a cost of $2.0
out to France(CDG) at a cost of $1.0
out to Holland(AMS) at a cost of $1.0
out to Italy(LIN) at a cost of $1.0
out to Sweden(ARN) at a cost of $2.0
Italy(LIN) has 3 inbound routes and 3 outbound routes
in from France(CDG) at a cost of $2.0
in from Germany(FRA) at a cost of $1.0
in from Portugal(LIS) at a cost of $3.0
out to Portugal(LIS) at a cost of $3.0
out to France(CDG) at a cost of $2.0
out to Germany(FRA) at a cost of $1.0
Portugal(LIS) has 3 inbound routes and 3 outbound routes
in from England(LHR) at a cost of $3.0
in from France(CDG) at a cost of $2.0
in from Italy(LIN) at a cost of $3.0
out to England(LHR) at a cost of $3.0
out to France(CDG) at a cost of $2.0
out to Italy(LIN) at a cost of $3.0
Iceland(KEF) has 1 inbound routes and 1 outbound routes
in from England(LHR) at a cost of $3.0
out to England(LHR) at a cost of $3.0
Denmark(CPH) has 2 inbound routes and 2 outbound routes
in from Holland(AMS) at a cost of $1.0
in from Norway(OSL) at a cost of $1.0
out to Holland(AMS) at a cost of $1.0
out to Norway(OSL) at a cost of $1.0
Norway(OSL) has 2 inbound routes and 2 outbound routes
in from Denmark(CPH) at a cost of $1.0
in from Sweden(ARN) at a cost of $1.0
out to Denmark(CPH) at a cost of $1.0
out to Sweden(ARN) at a cost of $1.0
Finland(HEL) has 2 inbound routes and 2 outbound routes
in from Holland(AMS) at a cost of $2.0
in from Sweden(ARN) at a cost of $1.0
out to Sweden(ARN) at a cost of $1.0
out to Holland(AMS) at a cost of $2.0
Sweden(ARN) has 3 inbound routes and 3 outbound routes
in from Germany(FRA) at a cost of $2.0
in from Norway(OSL) at a cost of $1.0
in from Finland(HEL) at a cost of $1.0
out to Germany(FRA) at a cost of $2.0
out to Norway(OSL) at a cost of $1.0
out to Finland(HEL) at a cost of $1.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.