如何拆分 java 或 Kotlin 中的对象数组?

How to split an array of objects in java or Kotlin?

我已经问过一个关于这个的问题 但是,那只回答了字符串。我无法编辑它,因为那里已经有几个答案了。


现在,我明白了如何用 space 拆分它,如 post 中给出的那样。但是,我如何将它与自定义对象 class 分开,如下所示:

public class User{
   private boolean isAdult = false;
   private int age = 0;

   @Override
   public String toString(){
      return "User : { isAdult = " + isAdult + "        age = " + age + "}"
   }

   // getters and setters
}

现在,我想在 isAdult 为假的地方拆分。例如我有这个数组:

[User : { isAdult = true         age = 19}, User : { isAdult = false         age = 10}, User : { isAdult = true         age = 38}, User : { isAdult = false         age = 17}, User : { isAdult = true         age = 19}]

现在,将 isAdult 拆分为 false,它将是这样的:

Array1 = [User : { isAdult = true         age = 19}]
Array2 = [User : { isAdult = true         age = 38}]
Array3 = [User : { isAdult = true         age = 19}]

那么,我如何在 java 或 Kotlin

中实现这一点

这是一个科特林答案

我不是很清楚,但假设你正在处理一个 User 对象数组,这个函数将 return 一个数组数组,每个用户都是一个成年人:

fun convert(array : Array<User>) : Array<Array<User>> =
    array.filter { it.isAdult }.map { arrayOf(it) }.toTypedArray()

编辑:

从接受的答案来看,您希望它针对连续的成年用户分组在一起,这里有一个完整的 kotlin 工作程序演示它。 convert 没有分组,convert2 有:

data class User(var isAdult : Boolean, var age: Int) {
    override fun toString(): String {
        return "User : { isAdult = $isAdult        age = $age}"
    }
}

fun main() {
    val users = arrayOf(
        User(true, 3),
        User(true, 5),
        User(false, 6),
        User(true, 7),
        User(false, 9),
        User(true, 11)
    )

    for (array in convert(users)) {
        println(array.contentToString())
    }
    println("==============")
    for (array in convert2(users)) {
        println(array.contentToString())
    }
}

fun convert(array : Array<User>) : Array<Array<User>> =
    array.filter { it.isAdult }.map { arrayOf(it) }.toTypedArray()

fun convert2(array : Array<User>) : Array<Array<User>> =
    array.fold(arrayOf(arrayOf())) { result, user ->
        if (user.isAdult) {
            result.copyOf(result.lastIndex).filterNotNull().toTypedArray() + (result.last() + user)
        } else result + arrayOf<User>()
    }

输出:

[User : { isAdult = true        age = 3}]
[User : { isAdult = true        age = 5}]
[User : { isAdult = true        age = 7}]
[User : { isAdult = true        age = 11}]
==============
[User : { isAdult = true        age = 3}, User : { isAdult = true        age = 5}]
[User : { isAdult = true        age = 7}]
[User : { isAdult = true        age = 11}]

基于 tquadrat 的回答(在 Java 中):

public static class User{
        boolean isFalse;
        int value;

        public User(boolean b, int v){
            this.isFalse = b;
            this.value = v;
        }

        public String toString() { return "User("+this.isFalse+", "+this.value+")"; }
}


 public static void main(String[] args) {
        User[] users = {new User(true, 5), new User(true, 1),new User(false, 7),
                new User(true, 10), new User(false, 3)};
        ArrayList<User[]> output = new ArrayList<>();

        int start = 0;
        int end = 0;
        while( end < users.length )
        {
            if( users[end].isFalse == false)
            {
                output.add( Arrays.copyOfRange( users, start, end  ));
                start = end + 1;
            }
            ++end;
        }
        if( start < end ) output.add( Arrays.copyOfRange( users, start, end ));

        for (User[] arr: output){
            System.out.println(Arrays.toString(arr));
        }

    }

给出输出:

[User(true, 5), User(true, 1)]
[User(true, 10)]