Перемещение данных на двумерный массив - PullRequest
0 голосов
/ 01 января 2019

У меня есть двумерный массив, который выглядит следующим образом:

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

По сути, в некоторых случаях первая часть текста отделяется 'и', а в других случаях '&',Иногда данные даже используют оба.

Пример макета первой строки над массивом:

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

и т. Д.

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Лучше создать простой класс вместо базирования массивов, который может выглядеть следующим образом:

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] на & или 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 в классе,вы можете поиграть с этим методом, чтобы получить желаемый результат, в вашем случае, если вы хотите именно этот формат, вы можете просто изменить на String:

@Override
public String toString() {
    return s1 + "," + s2 + "," + i1 + "," + i2;
}
0 голосов
/ 01 января 2019

Если ваши данные представляют собой 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.

0 голосов
/ 01 января 2019
   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]
...