Java 在二维数组上移动数据

Java 在二维数组上移动数据,java,arrays,split,Java,Arrays,Split,我有一个二维数组,布局如下: John,Car,4324,4944 Jill & Peter,Bus,5433,6544 Greg,Bus,9384,4329 Jill & Greg and Bill,Truck,3213,4324 Mike,Bus,4324,3424 Greg & Lisa & John,bus,4324,4334 基本上,在某些情况下,文本的第一部分用“and”分隔,在其他情况下用“&”分隔。有时数据甚至同时使用这两种方法 阵列上方第一行的

我有一个二维数组,布局如下:

John,Car,4324,4944
Jill & Peter,Bus,5433,6544
Greg,Bus,9384,4329
Jill & Greg and Bill,Truck,3213,4324
Mike,Bus,4324,3424
Greg & Lisa & John,bus,4324,4334
基本上,在某些情况下,文本的第一部分用“and”分隔,在其他情况下用“&”分隔。有时数据甚至同时使用这两种方法

阵列上方第一行的布局示例如下:

Array[0][0] = John
Array[0][1] = Car
Array[0][2] = 4324
Array[0][3] = 4944
我不知道如何处理这段代码,但我要求每个名称都在一个单独的行上,但后面的所有数据都是相同的

因此,上面的数组将变成:

John,Car,4324,4944
Jill,Bus,5433,6544
Peter,Bus,5433,6544
Greg,Bus,9384,4329
Jill,Truck,3213,4324
Greg,Truck,3213,4324
Bill,Truck,3213,4324
Mike,Bus,4324,3424
Greg,Bus,4324,4334
Lisa,Bus,4324,4334
John,Bus,4324,4334
因此,在上面的示例中,数组将是:

Array[0][0] = John
Array[0][1] = Car
Array[0][2] = 4324
Array[0][3] = 4944

Array[1][0] = Jill
Array[1][1] = Bus
Array[1][2] = 5433
Array[1][3] = 6544

Array[2][0] = Peter
Array[2][1] = Bus
Array[2][2] = 5433
Array[2][3] = 6544

etc etc

最好创建一个简单的类,而不是以数组为基础,它可以如下所示:

   public static void main(String[] args) {
        List<String[]> datas = new ArrayList<String[]>();
        datas.add("John,Car,4324,4944".split(","));
        datas.add("Jill & Peter,Bus,5433,6544".split(","));
        datas.add("Greg,Bus,9384,4329".split(","));
        datas.add("Jill & Greg and Bill,Truck,3213,4324".split(","));
        datas.add("Mike,Bus,4324,3424".split(","));
        datas.add("Greg & Lisa & John,bus,4324,4334".split(","));
        datas.add("Greg & roland & John,bus,4324,4334".split(","));

        for (String[] data : datas) {
            if(data[0].contains("&") || data[0].contains(" and ")) {
                String[] names = data[0].split("&|(\\sand\\s)");
                for (String name : names) {
                    data[0] = name.trim();
                    System.out.println(Arrays.toString(data));
                }
            }else {
                System.out.println(Arrays.toString(data));
            }
        }
    }
class MyObject {

    private String s1;
    private String s2;
    private Integer i1;
    private Integer i2;

    // constructor, getters and setters
}
然后,如果您使用的是Java8+,那么您可以使用流式处理,这样会更有帮助:

List<MyObject> result = Arrays.stream(array)
        .map(t -> Arrays.stream(t[0].split("\\s(&|and)\\s"))
                        .map(v -> new MyObject(v, t[1], Integer.valueOf(t[2]), Integer.valueOf(t[3])))
                .collect(Collectors.toList())
        ).flatMap(List::stream)
        .collect(Collectors.toList());
注意:输出基于类中的toString,您可以使用该方法获得所需的输出,在您的情况下,如果您想要确切的格式,您可以将toString更改为:

@Override
public String toString() {
    return s1 + "," + s2 + "," + i1 + "," + i2;
}

最好创建一个简单的类,而不是以数组为基础,它可以如下所示:

class MyObject {

    private String s1;
    private String s2;
    private Integer i1;
    private Integer i2;

    // constructor, getters and setters
}
然后,如果您使用的是Java8+,那么您可以使用流式处理,这样会更有帮助:

List<MyObject> result = Arrays.stream(array)
        .map(t -> Arrays.stream(t[0].split("\\s(&|and)\\s"))
                        .map(v -> new MyObject(v, t[1], Integer.valueOf(t[2]), Integer.valueOf(t[3])))
                .collect(Collectors.toList())
        ).flatMap(List::stream)
        .collect(Collectors.toList());
注意:输出基于类中的toString,您可以使用该方法获得所需的输出,在您的情况下,如果您想要确切的格式,您可以将toString更改为:

@Override
public String toString() {
    return s1 + "," + s2 + "," + i1 + "," + i2;
}

如果您的数据是CSV文件,我将首先创建自己的Person类:

然后,您可以读取CSV文件,并将其解析为Person对象列表:


注意:如果您不使用CSV文件,上述相同逻辑将起作用。我认为展示一个文件CSV解析示例也会很有帮助

如果您的数据是CSV文件,我将首先创建自己的Person类:

然后,您可以读取CSV文件,并将其解析为Person对象列表:



注意:如果您不使用CSV文件,上述相同逻辑将起作用。我认为展示一个文件CSV解析示例也会很有帮助

首先编写一个表示行的类,其中包含4个命名和类型化属性。然后学习如何使用集合而不是数组。然后解析对象的第一个属性:如果它包含and或&,则将其拆分为单个名称。对于每个部分,创建一个仅使用该名称的对象副本,并将其添加到列表中。这些都是非常基本的内容。你到底在哪里遇到困难?@henry,基本对你来说可能并不意味着对每个人都一样。因此我们有了StackOverflow。首先编写一个表示一行的类,它有4个命名和类型化属性。然后学习如何使用集合而不是数组。然后解析对象的第一个属性:如果它包含and或&,则将其拆分为单个名称。对于每个部分,创建一个仅使用该名称的对象副本,并将其添加到列表中。这些都是非常基本的内容。你到底在哪里遇到困难?@henry,基本对你来说可能并不意味着对每个人都一样。因此我们有了StackOverflow。@Henry我用过regex,现在可以了吗?@Henry我用Roland这个名字试过了,请告诉我我是否还遗漏了其他的场景。是的,其中一个名字是:Hernandez,并且是Spillt。除此之外,它工作得非常好。@Bradie我已经更新了它,并以Hernandez的名字测试了它。现在它工作了,请检查它是否适合你。还有,如果它起作用,请你接受并投票。@Henry我用过regex,现在好了吗?@Henry我试过名字Roland,请告诉我是否还有其他我遗漏的场景。是的,其中一个名字是:Hernandez,并且是Split it。除此之外,它工作得非常好。@Bradie我已经更新了它,并以Hernandez的名字测试了它。现在它工作了,请检查它是否适合你。如果有效的话,也请你接受并投票。我在投我的票时没有看到这个答案,我还建议单独上课。谢谢:。你的答案很好。我必须学会如何更频繁地使用它们:P.我在上我的课时没有看到这个答案,我还建议单独上一节课。谢谢:。你的答案很好。我必须学会如何更频繁地使用它们:P。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import java.util.List;
import java.util.ArrayList;

public class Move {
    private static final String CSV_FILE = "data.csv";
    private static final String CSV_DELIMITER = ",";

    // Store list of objects here
    private static List<Person> fileData = new ArrayList<>();

    public static void main(String[] args) {

        // Parse CSV file
        String line = "";
        try (BufferedReader br = new BufferedReader(new FileReader(CSV_FILE))) {
            while ((line = br.readLine()) != null) {

                // Split data first by delimiter
                String[] data = line.split(CSV_DELIMITER);

                // Split names by & or and
                String[] names = data[0].split("&|and");

                // Add objects to list with correct conversions
                for (String name : names) {
                    String vehicle = data[1];
                    Integer firstNumber = Integer.parseInt(data[2]);
                    Integer secondNumber = Integer.parseInt(data[3]);
                    Person person = new Person(name.trim(), vehicle, firstNumber, secondNumber);
                    fileData.add(person);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Print out objects
        for (Person person : fileData) {
            System.out.println(person.toString());
        }
    }
}
[John, Car, 4324, 4944]
[Jill, Bus, 5433, 6544]
[Peter, Bus, 5433, 6544]
[Greg, Bus, 9384, 4329]
[Jill, Truck, 3213, 4324]
[Greg, Truck, 3213, 4324]
[Bill, Truck, 3213, 4324]
[Mike, Bus, 4324, 3424]
[Greg, bus, 4324, 4334]
[Lisa, bus, 4324, 4334]
[John, bus, 4324, 4334]