gpt4 book ai didi

java - 是否有用于列表复杂处理的 Java API?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:17:59 26 4
gpt4 key购买 nike

<分区>

我有以下元素 list (订单事项):

<A> <B> [ ] [\n] <C> [  ] [   ] [\n\r] <D> <A> [ ] [ xyz ] [ abc ] <X>

我想合并用方括号表示的文本节点:

<A> <B> [ \n] <C> [     \n\r] <D> <A> [  xyz  abc ] <X>

我用标志和 prevNode 指针编写了 for-each 循环 来完成任务,但感觉不对:

  • 10 秒内可以口头表达的任务太费力了;
  • 如果没有注释,理解代码需要一些脑力和时间。

我相信这就是 Java 8 Stream API 的意义所在:编写代码更省力,阅读代码更省力。

Java有没有类似的机制来处理列表?

更新。

鉴于没有现成的解决方案,我开发了一个非常简单的 fluent API 来解决这个任务。减少现在看起来就像这样:

List<Node> output = ListStream.of(input)
.continuousRegion(node -> node instanceof TextNode)
.reduceRegion((a, b) -> new TextNode(a.value + b.value))
.toArrayList();

它完美地解决了许多任务,您必须在列表中的连续区域 上操作。我有很多这些,为进一步的数据处理准备 XML。


算法:

public List<Node> reduce(List<Node> list) {
List<Node> result = new ArrayList<>();

TextNode prevTextNode = null;
for (Node node : list) {
if (node instanceof TextNode) {
TextNode textNode = (TextNode) node;

if (prevTextNode == null) {
prevTextNode = textNode;
} else {
prevTextNode = new TextNode(prevTextNode.value + textNode.value);
}
} else {
if (prevTextNode != null) {
result.add(prevTextNode);
prevTextNode = null;
}

result.add(node);
}
}

if (prevTextNode != null) {
result.add(prevTextNode);
}

return result;
}

所有代码(可编译):

import com.sun.deploy.util.StringUtils;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static org.junit.Assert.assertEquals;

public class ListReductionExample {
class Node {
final String value;

Node(String value) {
this.value = value;
}

@Override
public String toString() {
return "<" + value + ">";
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Node)) return false;

Node node = (Node) o;

return value != null ? value.equals(node.value) : node.value == null;
}

@Override
public int hashCode() {
return value != null ? value.hashCode() : 0;
}
}

class TextNode extends Node {
TextNode(String value) {
super(value);
}

@Override
public String toString() {
return "[" + value + "]";
}

}

public List<Node> reduce(List<Node> list) {
List<Node> result = new ArrayList<>();

TextNode prevTextNode = null;
for (Node node : list) {
if (node instanceof TextNode) {
TextNode textNode = (TextNode) node;

if (prevTextNode == null) {
prevTextNode = textNode;
} else {
prevTextNode = new TextNode(prevTextNode.value + textNode.value);
}
} else {
if (prevTextNode != null) {
result.add(prevTextNode);
prevTextNode = null;
}

result.add(node);
}
}

if (prevTextNode != null) {
result.add(prevTextNode);
}

return result;
}

public void printList(List<Node> list) {
List<String> listOfStrings = list.stream().map(Node::toString).collect(Collectors.toList());

System.out.println(StringUtils.join(listOfStrings, " "));
}

@Test
public void test() {
// <A> <B> [ ] [N] <C> [ ] [ ] [NR] <D> <A> [ ] [ xyz ] [ abc ] <X>
List<Node> input = new ArrayList<>();
input.add(new Node("A"));
input.add(new Node("B"));
input.add(new TextNode(" "));
input.add(new TextNode("N"));
input.add(new Node("C"));
input.add(new TextNode(" "));
input.add(new TextNode(" "));
input.add(new TextNode("NR"));
input.add(new Node("D"));
input.add(new Node("A"));
input.add(new TextNode(" "));
input.add(new TextNode(" xyz "));
input.add(new TextNode(" abc "));
input.add(new Node("X"));

printList(input);

// <A> <B> [ N] <C> [ NR] <D> <A> [ xyz abc ] <X>
List<Node> expectedOutput = new ArrayList<>();
expectedOutput.add(new Node("A"));
expectedOutput.add(new Node("B"));
expectedOutput.add(new TextNode(" N"));
expectedOutput.add(new Node("C"));
expectedOutput.add(new TextNode(" NR"));
expectedOutput.add(new Node("D"));
expectedOutput.add(new Node("A"));
expectedOutput.add(new TextNode(" xyz abc "));
expectedOutput.add(new Node("X"));

printList(expectedOutput);

assertEquals(expectedOutput, reduce(input));
}
}

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com