我通过从csv获取字段数据,从网站自动填写表格中的一些流程。
现在,对于地址,表格中有3个字段:
地址1 ____________
地址2 ____________
地址3 ____________
每个字段都有35个字符的限制,所以每当我得到35个字符时,我会继续第二个地址字段中的地址字符串......
现在,问题在于我现在的解决方案会拆分它,但是如果它达到35个字符就会切断它,如果str和'o'中的'barcelona'这个词是第35个字符,那么地址2将是'na'。
在这种情况下,我想确定第35个字符是否是单词的中间,并将整个单词带到下一个字段。
这是我目前的解决方案:
private def enterAddress(purchaseInfo: PurchaseInfo) = {
val webElements = driver.findElements(By.className("address")).toList
val strings = purchaseInfo.supplierAddress.grouped(35).toList
strings.zip(webElements).foreach{
case (text, webElement) => webElement.sendKeys(text)
}
}
我会在这里感谢一些帮助,最好是使用Scala,但java也会很好:)
感谢分配!
答案 0 :(得分:2)
既然你说你也接受Java代码......下面的代码会将给定的输入字符串包装到给定最大长度的几行:
import java.util.ArrayList;
import java.util.List;
public class WordWrap {
public static void main(String[] args) {
String input = "This is a rather long address, somewhere in a small street in Barcelona";
List<String> wrappedLines = wrap(input, 35);
for (String line : wrappedLines) {
System.out.println(line);
}
}
private static List<String> wrap(String input, int maxLength) {
String[] words = input.split(" ");
List<String> lines = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
for (String word : words) {
if (sb.length() == 0) {
// Note: Will not work if a *single* word already exceeds maxLength
sb.append(word);
} else if (sb.length() + word.length() < maxLength) {
// Use < maxLength as we add +1 space.
sb.append(" " + word);
} else {
// Line is full
lines.add(sb.toString());
// Restart
sb = new StringBuilder(word);
}
}
// Add the last line
if (sb.length() > 0) {
lines.add(sb.toString());
}
return lines;
}
}
输出:
This is a rather long address,
somewhere in a small street in
Barcelona
这不一定是最好的方法,但我想你无论如何都必须适应Scala。
如果您更喜欢图书馆解决方案(因为...为什么要重新发明轮子?),您还可以查看WordUtils.wrap() from Apache Commons。
答案 1 :(得分:0)
英语中的单词由空格(或其他标点符号)分隔,但在这种情况下这是无关紧要的,除非你真的想根据它来换行),并且有几个选项可以利用它来为你带来好处:
你可能做的一件事是从你的字符串中取一个35个字符的子字符串,使用String.lastIndexOf来确定空格的位置,并且只将该空格添加到你的地址行,然后重复从你输入字符串之前的空格字符。
另一种方法(在Marvin的回答中展示)是在空格上使用String.split并将它们连接在一起,直到下一个单词会导致字符串超过35个字符。