Web方法:我们可以在循环遍历documentList时从documentList中删除一个元素

时间:2012-03-21 19:46:38

标签: java java-ee webmethods

在WEBMETHODS中,可以在循环文档列表时从DocumentList中删除元素吗?如果是,那怎么样?如果否,那么我们如何将DocumentList变量的值设置为null。

感谢
nohsib

3 个答案:

答案 0 :(得分:4)

Tundra包含用于从文档列表中删除项目的服务(com.wm.data.IData[]):tundra.list.document:drop($list[], $index)

  • $list是您要从中删除该项目的文档列表(com.wm.data.IData[]
  • $index是要删除的项目的从零开始的数组索引

相关的Java代码如下:

public static final void drop(IData pipeline) throws ServiceException {
  IDataCursor cursor = pipeline.getCursor();

  try {
    Object[] list = IDataUtil.getObjectArray(cursor, "$list");
    String index = IDataUtil.getString(cursor, "$index");

    if (index != null) IDataUtil.put(cursor, "$list", drop(list, index));
  } finally {
    cursor.destroy();
  }
}

// returns a new array which contains all the elements from the given arrays
public static <T> T[] concatenate(T[] array, T[] items) {
  if (array == null) return items;
  if (items == null) return array;

  java.util.List<T> list = new java.util.ArrayList<T>(array.length + items.length);

  java.util.Collections.addAll(list, array);
  java.util.Collections.addAll(list, items);

  return list.toArray(java.util.Arrays.copyOf(array, 0));
}

// removes the element at the given index from the given list
public static <T> T[] drop(T[] array, String index) {
  return drop(array, Integer.parseInt(index));
}

// removes the element at the given index from the given list
public static <T> T[] drop(T[] array, int index) {
  if (array != null) {
    // support reverse/tail indexing
    if (index < 0) index += array.length;
    if (index < 0 || array.length <= index) throw new ArrayIndexOutOfBoundsException(index);

    T[] head = slice(array, 0, index);
    T[] tail = slice(array, index + 1, array.length - index);

    array = concatenate(head, tail);      
  }
  return array;
}

// returns a new array which is a subset of elements from the given array
public static <T> T[] slice(T[] array, int index, int length) {
  if (array == null || array.length == 0) return array;
  // support reverse/tail length
  if (length < 0) length = array.length + length;
  // support reverse/tail indexing
  if (index < 0) index += array.length;
  // don't slice past the end of the array
  if ((length += index) > array.length) length = array.length;

  return java.util.Arrays.copyOfRange(array, index, length);
}

但是,我同意MrJames:最好和最简单的方法是创建一个新的文档列表,只使用pub.list:appendToDocumentList(或tundra.list.document:append将所需的项目附加到新列表中,如果你在循环步骤中使用Tundra)。

答案 1 :(得分:2)

您可以使用文档删除内置服务的文档。

这是一个非常简单的例子,希望这能反映出函数的用法。

  1. 循环浏览这些文件
  2. 分支以在映射步骤中收集循环中不需要的文档的索引
  3. 在循环外部,使用pub.document:deleteDocuments从原始文档中删除这些文档列表。
  4. 希望这有帮助。

答案 2 :(得分:1)

我有一些测试,可以将特定的Document项设置为null(使用service pub.list:setListItem),但文档列表将保持相同的大小。

其他方式是循环文档列表并将您感兴趣的文档列表追加到新文档列表中(pub.list:appendToDocumentList)。

关于如何将变量设置为null的另一个问题,您可以使用管道上的Drop

PS:使用webMethods 7.1.2