Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现这样的修剪异常数据?_Java_Algorithm - Fatal编程技术网

Java 如何实现这样的修剪异常数据?

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

我有一个包含随机对象的列表:I和o字符

数据有两种类型,i和o Data.type

我想用Java编写一个函数,可以将列表排列为I,o,I,o,I,o

如果遇到多个i,则应选择第一个i。如果遇到多个o,则应选择最后一个


有人能告诉我实现这一点的最简单方法吗?

如果在结果字符串中选择第一个或最后一个要解压缩的字符,则没有什么区别,因此请尝试以下方法[始终使用第一个匹配的字符]:

*假设输入的格式为“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;
}