Java 如何实现这样的修剪异常数据?
我有一个包含随机对象的列表:I和o字符 数据有两种类型,i和o Data.type 我想用Java编写一个函数,可以将列表排列为I,o,I,o,I,o 如果遇到多个i,则应选择第一个i。如果遇到多个o,则应选择最后一个Java 如何实现这样的修剪异常数据?,java,algorithm,Java,Algorithm,我有一个包含随机对象的列表:I和o字符 数据有两种类型,i和o Data.type 我想用Java编写一个函数,可以将列表排列为I,o,I,o,I,o 如果遇到多个i,则应选择第一个i。如果遇到多个o,则应选择最后一个 有人能告诉我实现这一点的最简单方法吗?如果在结果字符串中选择第一个或最后一个要解压缩的字符,则没有什么区别,因此请尝试以下方法[始终使用第一个匹配的字符]: *假设输入的格式为“str” String str = "ioooioooiooiiiiooo"; Str
有人能告诉我实现这一点的最简单方法吗?如果在结果字符串中选择第一个或最后一个要解压缩的字符,则没有什么区别,因此请尝试以下方法[始终使用第一个匹配的字符]: *假设输入的格式为“str”
String str = "ioooioooiooiiiiooo";
StringBuilder sb = new StringBuilder();
Matcher matcher = Pattern.compile("i+|o+").matcher(str);
while (matcher.find()) {
sb.append(str.charAt(matcher.start())).append(',');
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length()-1);
}
System.out.println(sb);
使用sb.toString从StringBuilder获取结果字符串
编辑:
刚刚注意到您的输入是一个列表,假设它是列表,您可以执行以下操作,当然您可以将其更改为列表
如果我看对了,您已经定义了如下数据类:
public class Data {
private char type;
private Foo value; // placeholder for whatever else this kind of
// object represents
public char getType () {
return type;
}
// other methods...
}
您还有一些列表,其中包含以下内容的集合
物体。现在您要创建一个新列表,其中
具有相同类型的多个数据的序列被合并
到单个元素。如果是类型为i的数据序列,
这个元素应该是这个序列的第一个元素,
否则,它应该是它的最后一个元素
这将产生如下代码:
public List<Data> conflateList (List<Data> longList) {
List<Data> resultList = new ArrayList<Data>();
for (Data element: longList) {
if (element.getType() == 'i' &&
(resultList.size() == 0 ||
resultList.get(resultList.size() - 1).getType() == 'o')) {
// only the first consecutive `i` is added
resultList.add(lastElement);
}
if (element.getType() == 'o') {
if (resultList.size() == 0 ||
resultList.get(resultList.size() - 1).getType() == 'i') {
// all `o`s are at least temporarily added
resultList.add(element);
} else {
// consecutive `o`s are replaced
resultList.set(resultList.size() - 1, element);
}
}
}
return resultList;
}
你的问题不清楚:像单元测试一样显示输入和输出。你为什么不数一数列表中的i和o,然后写下列表?这是家庭作业吗?如果是这样,请标记作业。事实上,这不是作业,我会在我的代码中使用,可能我的问题不够清楚…更新了我的问题,请让我知道是否清楚。事实上,这是有区别的,因为我的字符在我们的业务逻辑中是不同的,所以你有什么建议吗?更新了我的问题,请喝一杯look@MemoryLeak:我编辑了答案的第二部分[处理列表]以匹配您编辑的问题。好主意!!!,谢谢我用了三圈来处理,你的想法看起来很简单。。。非常感谢@MemoryLeak:再次编辑,忘记插入最后一个“o”元素。现在看最后3行[在while范围之后]
public List<Data> conflateList (List<Data> longList) {
List<Data> resultList = new ArrayList<Data>();
for (Data element: longList) {
if (element.getType() == 'i' &&
(resultList.size() == 0 ||
resultList.get(resultList.size() - 1).getType() == 'o')) {
// only the first consecutive `i` is added
resultList.add(lastElement);
}
if (element.getType() == 'o') {
if (resultList.size() == 0 ||
resultList.get(resultList.size() - 1).getType() == 'i') {
// all `o`s are at least temporarily added
resultList.add(element);
} else {
// consecutive `o`s are replaced
resultList.set(resultList.size() - 1, element);
}
}
}
return resultList;
}