selenium—编写java代码或优化它以从arraylist构建字符串的更干净的方法是什么?

n53p2ov0  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(275)

我正在使用selenium创建一个java刮削程序,并将数据插入数据库。我正积极地寻求提高我的技能,但我不觉得教学视频太有帮助,因为我失去了兴趣,但我真的很喜欢通过实践学习。下面的代码可以根据需要工作,但它看起来真的很难看,我觉得必须有一个更好/更干净的解决方案。为了便于参考,它构建了一个逗号分隔的字符串,其中包含诸如“value1”或“value1,value2”等数据,具体取决于关键字计数。我原来的逻辑是输出“,value1,value2”,这就是为什么我添加了“if(x==0)”逻辑。我有很多像这样草率的方法,所以任何改进我的代码的指针都很感激,谢谢!

ArrayList<String> keywords = new ArrayList<String>();
keywords = keywordChecker(title);
        for (int x = 0; x < keywords.size(); x++) {
                    String list = keywords.get(x);
                    if (x == 0) {
                        keywordListBuilder = list;
                    } else if (x > 0) {
                        keywordListBuilder = keywordListBuilder + ", " + list;
                    }
                }
                keywordValues.add(keywordListBuilder);

    public ArrayList<String> keywordChecker(String title) {
        ArrayList<String> keywordList = new ArrayList<String>();
        String keyword1 = "";
        String keyword2 = "";
        String keyword3 = "";
        String[] keywordTextCombinations = { "Value1", "Value2", "Value3", [imagine a list of 20 items]};
        for (int i = 0; i < keywordTextCombinations.length; i++) {
            if (title.toLowerCase().contains(keywordTextCombinations[i].toLowerCase())) {
                keyword1 = keywordTextCombinations[i];
                keywordList.add(keyword1);
                break;
            }
        }
        for (int i = 0; i < keywordTextCombinations.length; i++) {
            if (title.toLowerCase().contains(keywordTextCombinations[i].toLowerCase())
                    && !keywordTextCombinations[i].toLowerCase().equals(keyword1.toLowerCase())
                    && !keywordTextCombinations[i].toLowerCase().equals(keyword2.toLowerCase())) {
                keyword2 = keywordTextCombinations[i];
                keywordList.add(keyword2);
                break;
            }
        }
        for (int i = 0; i < keywordTextCombinations.length; i++) {
            if (title.toLowerCase().contains(keywordTextCombinations[i].toLowerCase())
                    && !keywordTextCombinations[i].toLowerCase().equals(keyword1.toLowerCase())
                    && !keywordTextCombinations[i].toLowerCase().equals(keyword2.toLowerCase())) {
                keyword3 = keywordTextCombinations[i];
                keywordList.add(keyword3);
                break;
            }
        }
        return keywordList;
    }
n3h0vuf2

n3h0vuf21#

ArrayList<String> keywords = new ArrayList<String>();
keywords = keywordChecker(title);

这将:
创建一个新变量,名为 keywords ,可以指向数组列表。
创建新的arraylist对象。
将对新创建对象的引用指定给 keywords 变量。
然后丢弃该引用并使所创建的对象成为即时垃圾,然后立即为其分配其他引用。
换句话说 new ArrayList<String>(); 只会浪费时间和空间。把它扔掉。让我们也像其他java程序员一样,使用我们感兴趣的最通用的类型。对于初学者来说,这基本上意味着“变量应该是 List ,不是 ArrayList . 以与其他java程序员类似的风格编写代码是很好的;使他们更容易阅读代码,也使他们更容易阅读您的代码。

List<String> keywords = keywordChecker(title);
for (int x = 0; x < keywords.size(); x++) {
  String list = keywords.get(x);
  if (x == 0) {
    keywordListBuilder = list;
  } else if (x > 0) {
    keywordListBuilder = keywordListBuilder + ", " + list;
  }
}
keywordValues.add(keywordListBuilder);

你只得到一个关键字,你称之为 list ? 名字很重要。当他们撒谎时,你的代码就变得不可读了。
将字符串列表转换为一个包含所有值的字符串,并用逗号分隔。听起来像是一份普通的工作。当某件事听起来很平常时,就上网搜索。你通常会发现只有一行。就在这里:

keywordValues.add(String.join(", ", keywords));

噢,代码太少了。
这个 keywordChecker 方法
它有助于记录代码,特别是在请求帮助时。显然,这种方法是扫描所提供的 title 变量,并搜索任意一个关键字列表,则返回每个匹配关键字。但是,您最多只能返回3个。我猜你不想那样。但如果你这样做了,我会告诉你怎么做,当然是一行。

String keyword1 = "";
String keyword2 = "";
String keyword3 = "";

当你开始这样命名变量时,停止。这不可能是对的。想一想。你已经在使用它们了,你知道如何正确地做到这一点:列表。一旦你使用了一个列表,这就变得微不足道了。另外,方法名通常应该是动词;普通java风格。让我们也做常数,嗯,常数。我们也要避免数组,它们既笨重又烦人。

private static final List<String> KEYWORDS = List.of("Value1", "Value2", "Value3", [imagine a list of 20 items]);

public List<String> findMatchingKeywords(String title) {
    var out = new ArrayList<String>();
    String lowercased = title.toLowerCase();
    for (String keyword : KEYWORDS) {
      if (lowercased.contains(keyword.toLowerCase()) out.add(keyword);
    }
    return out;
}

那就省去了一大堆台词,太好了。如果你想返回最多不超过3个关键字。。。所有你需要做的是中止循环时,你'满'。作为for循环中的最后一行:

if (out.length() == 3) break;

综合起来:

keywordValues.add(String.join(", ", findMatchingKeywords(title)));

...

private static final List<String> KEYWORDS = List.of("Value1", "Value2", "Value3", [imagine a list of 20 items]);

public List<String> findMatchingKeywords(String title) {
  var out = new ArrayList<String>();
  String lowercased = title.toLowerCase();
  for (String keyword : KEYWORDS) {
    if (lowercased.contains(keyword.toLowerCase()) {
      out.add(keyword);
      if (out.length() == 3) break;
    }
  }
  return out;
}
whhtz7ly

whhtz7ly2#

您可以尝试在一个for循环中完成所有操作。另外,我建议您使用hashset,因为您正在比较元素。hashset不能包含重复的元素,因此如果您尝试添加一个已经存在的元素,它不会这样做,并且返回false(是的,hashset中的add函数返回一个布尔值)。

相关问题