【问题标题】:Moving data on a 2 dimensional array在二维数组上移动数据
【发布时间】:2019-01-01 09:33:47
【问题描述】:

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

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

等等等等

【问题讨论】:

  • 首先编写一个代表一行的类,它有 4 个命名和类型化的属性。然后学习如何使用集合而不是数组。然后解析对象的第一个属性:如果它包含 and 或 &,则将其拆分为单个名称。对于每个部分,使用该名称创建对象的副本,并将其添加到列表中。
  • 这都是非常基本的东西。你到底有什么困难?
  • @henry,对你来说基本的可能并不意味着对每个人都一样。因此我们有 StackOverflow。

标签: java arrays split


【解决方案1】:
   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));
            }
        }
    }

输出

[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]
[Greg, bus, 4324, 4334]
[roland, bus, 4324, 4334]
[John, bus, 4324, 4334]

【讨论】:

  • @Henry 我用过正则表达式现在可以了吗?
  • @Henry 我试过用名字 Roland ,如果还有其他我遗漏的场景,请告诉我。
  • 是的,其中一个名字是:“Hernandez”并且被洒了。除此之外,它的效果非常好。
  • @Bradie 我已经更新测试了它的名字 (Hernandez) 现在它可以工作了,请检查它是否适合你。如果它有效,请您接受并投票。
【解决方案2】:

最好创建一个简单的类而不是基于数组,它看起来像这样:

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());

对于数组中的每个元素,将第一个 t[0] 除以 &amp;and,然后为每个恶意元素创建一个新对象,然后收集结果。

ideone demo


输出如下:

MyClass{s1=John, s2=Car, i1=4324, i2=4944}
MyClass{s1=Jill , s2=Bus, i1=5433, i2=6544}
MyClass{s1= Peter, s2=Bus, i1=5433, i2=6544}
MyClass{s1=Greg, s2=Bus, i1=9384, i2=4329}
MyClass{s1=Jill , s2=Truck, i1=3213, i2=4324}
MyClass{s1= Greg , s2=Truck, i1=3213, i2=4324}
MyClass{s1= Bill, s2=Truck, i1=3213, i2=4324}
MyClass{s1=Mike, s2=Bus, i1=4324, i2=3424}
MyClass{s1=Greg , s2=bus, i1=4324, i2=4334}
MyClass{s1= Lisa , s2=bus, i1=4324, i2=4334}
MyClass{s1= John, s2=bus, i1=4324, i2=4334}

注意:输出基于类中的 toString,您可以使用该方法来获得所需的输出,在您的情况下,如果您想要该格式,您可以将 toString 更改为:

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

【讨论】:

  • 我发的时候没有看到这个答案,我也建议单独上课。
  • 谢谢:)。您的回答非常适合流。我必须学习如何更频繁地使用它们:P。
【解决方案3】:

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

public class Person {
    private String name;
    private String vehicle;
    private Integer firstNumber;
    private Integer secondNumber;

    public Person(String name, String vehicle, Integer firstNumber, Integer secondNumber) {
        this.name = name;
        this.vehicle = vehicle;
        this.firstNumber = firstNumber;
        this.secondNumber = secondNumber;
    }

    @Override
    public String toString() {
        return "[" + this.name + ", " + this.vehicle + ", " + this.firstNumber.toString() + ", " + this.secondNumber.toString() + "]";
    }
}

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

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());
        }
    }
}

从我们的自定义 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]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多