我想写一个小算法。
我遇到以下问题:我的dx=.01;
dy=.01;
x=-3:dx:3;
y=-3:dy:3;
[X,Y]=meshgrid(x,y);
f=X.^2+Y.^2;
lr = .1; %learning rate
eps = 1e-10; %epsilon threshold
tooMuch = 1e5; %limit iterations
p = [.1 1]; %starting point
[~, idx] = min( abs(x-p(1)) ); %index of closest value
[~, idy] = min( abs(y-p(2)) ); %index of closest value
p = [x(idx) y(idy)]; %closest point to start
[xGrad,yGrad] = gradient(f); %partial derivatives of f
xGrad = xGrad/dx; %scale correction
yGrad = yGrad/dy; %scale correction
for i=1:tooMuch %prevents too many iterations
fGrad = [ xGrad(idx,idy) , yGrad(idx,idy) ]; %gradient's definition
pTMP = p(end,:) - lr*fGrad; %gradient descent's core
[~, idx] = min( abs(x-pTMP(1)) ); %index of closest value
[~, idy] = min( abs(y-pTMP(2)) ); %index of closest value
p = [p;x(idx) y(idy)]; %add the new point
if sqrt( sum( (p(end,:)-p(end-1,:)).^2 ) ) < eps %check conversion
break
end
end
可以包含数字和以下符号:
$http.jsonp('https://api.forecast.io/forecast/myapikey/52.370216,4.895168' +'?callback=JSON_CALLBACK')...
,String
,-
。我想解析它,所以我可以得到每个符号和数字。
我想写的方法((
)应该连续返回符号和数字。例如:)
应返回:
getNextToken
getNextToken("(123-456)-12-1")
"("
等等。
我面临的问题是每个数字部分都可以包含几个数字。
我知道写这种功能并不是什么大不了的事,但它不是一个原始的&#34;功能。那么,Java有一个实用类来解决这个问题吗?
答案 0 :(得分:5)
可以调用java.util.StringTokenizer来在标记中包含分隔符
String str = "(123-456)-12-1";
StringTokenizer tokenizer = new StringTokenizer( str,"-()",true);
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
返回
(
123
-
456
)
-
12
-
1
这是你想要的吗?
答案 1 :(得分:3)
另一个与JohnTeixeira's answer输出相同的正则表达式解决方案:
String input = "(123-456)-12-1";
Pattern pattern = Pattern.compile("([()-]|\\d+)");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
它不使用&#34;不推荐&#34; StringTokenizer
课程。您可以找到此正则表达式here的确切详细信息。
答案 2 :(得分:1)
我不确定这是否是您正在寻找的,而且它不是真的可读。这是正则表达式的问题:\
String str = "(123-456)-12-1";
String splittedStr = Arrays.toString(str.split("((?<=-)|(?=-)|(?<=[(])|(?=[(])|(?<=[)])|(?=[)]))"));
System.out.println(splittedStr);
// Outputs: [(, 123, -, 456, ), -, 12, -, 1]
修改强> 我发现我使用的正则表达式可以简化很多。这个新示例使用了新的缩短版本:
String str = "(123-456)-12-1";
String splittedStr = Arrays.toString(str.split("((?<=-|[(]|[)])|(?=-|[(]|[)]))"));
System.out.println(splittedStr);
// Output: [(, 123, -, 456, ), -, 12, -, 1]