有没有更优雅的方法将字符串转换为数组?

4

我想将一个11位数字字符串转换为数组。在ColdFusion 9中有更优雅的方法吗?

local.string = [];

for (local.i = 1; local.i <= len(arguments.string); local.i++)
{
    local.string[ local.i ] = mid(arguments.string, local.i, 1);
}

如果我的字符串是12345,那么数组看起来会像这样string[1] = 1; string[2] = 2,以此类推...
4个回答

8

有一种优雅的方法,我认为在任何版本的ColdFusion中都可以使用。

诀窍是使用CF的列表操作函数-如果指定分隔符为""(即没有),它将把字符串的每个字符视为列表项。

所以你想要的是:

local.string = listToArray(arguments.string, "");

这将为您提供字符数组...


谢谢,我首先尝试了listToArray()函数,但不幸的是,我的大脑没能正确理解分隔符参数! - Mohamad
1
FYI:可能仅适用于CF9。在CF8中,结果是一个单元素数组。 - Leigh
@Leigh,至少还有一个人认为你是正确的:这种行为已被报告为CF9中的错误(bug),其中部分报告重复了你所说的,在CF8中,它只会返回原始字符串。 - Dave DuPlantis
@Dave - 是的,我有点同意另一个Dave的看法。它很整洁,但确实有一种“非预期功能”的感觉 ;) - Leigh

6

这适用于 CF8,而且并不依赖于 CF9 中的“错误”:

stringAsList = REReplace( string,"(.)","\1,","ALL" );
array = ListToArray( stringAsList );

@CFSimplicty,有趣的是..如果我理解正确的话,listToArray(string, "")的行为是一个bug?我对ColdFusion 8不是很感兴趣,但我不希望这个函数在未来的版本中出现问题... - Mohamad
1
@Mohamad,这是一个看法问题,它到底是一个bug还是一个特性(就我个人而言,我会说是一个bug:列表分隔符肯定至少需要1个字符),但最好不要依赖它,以防Adobe决定修复它。 - CfSimplicity
2
不错。我认为使用reMatch它甚至可以成为一行代码:result = Rematch("(.)", string); - Leigh
@Leigh:你不需要括号,但除此之外,这是我见过的最好的“本地CFML”答案。 - Adam Cameron
@AdamCameron - 是的,你说得对。我想既然没有反向引用,那么你只需要 rematch(".", string) 就可以了。很酷。 - Leigh

0

如果你真的想使用Java方法String.split(),它会返回一个String[]数组,因此你需要将其值复制到新数组中,例如: myArray = arrayNew(1) + myArray.addAll( myStringArr )


-2

有趣的是,你可以使用 .split() Java 方法来实现类似的功能并获得相似的结果。

一些背景知识:由于 CF 是基于 Java 构建的,因此它可以利用许多底层的 Java 方法和类。根据 Adobe 的 Rupesh Kuman(http://coldfused.blogspot.com/2007/01/extend-cf-native-objects-harnessing.html)所说,CF 数组是 java.util.List 的一个实现,因此所有列表方法也适用于 CF 数组。其中一个更有用的方法是 .split() 方法。它接受一个字符串,并根据任意的 0 或多个字符分隔符将其转换为数组。

这是我做的事情:将一个 11 位数字设置为列表,使用 split 方法创建数组,然后显示结果。

    <cfset testList = "12345678901" />
    <cfset testArray = testList.split("") />
    <cfset request.cfdumpinited = false />
    <cfdump label="testArray" expand="true" var="#testArray#"/>
    <cfabort />

如果你运行这个程序,你会发现最终得到的是一个12项的数组,其中第一项为空。只需使用ArrayDelete()或ArrayDeleteAt()删除它,你就可以顺利进行了。这应该适用于所有版本的ColdFusion,包括CFMX 6。

split()是java.lang.String的方法,不是List的方法。另外,ArrayDeleteAt(testArray)将失败,因为返回的数组是不可变的,它不是一个java.util.List对象。 - Leigh
挑刺很多吗?问题在于提问者正在寻找从基于 CF 的列表创建数组的替代方法。我认为我的答案做到了这一点。 - Larry C. Lyons
顺便说一句,我刚刚运行了 isArray(testArray),它返回了一个是。所以我不确定谁或什么是正确的。 - Larry C. Lyons
事实是你的建议没有产生期望的结果,即一个没有额外元素的数组。其他建议可以。请不要把事情看得太个人化。 - Leigh
是的,isArray()会误导性地返回true。testArray是一个Java String[]数组。但它不是CF数组(即java.util.List)。这就是为什么ArrayDeleteAt失败的原因之一。这是Java对象的许多微妙之处之一。http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接