如何拆分 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)]
我已经问过一个关于这个的问题
现在,我明白了如何用 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)]