簡體   English   中英

編寫此 Java 代碼或優化它以從 ArrayList 構建字符串的更簡潔的方法是什么?

[英]What's a cleaner way to write this Java code or optimize it to build a string from an ArrayList?

我正在使用 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;
    }
 ArrayList<String> keywords = new ArrayList<String>(); keywords = keywordChecker(title);

這將:

  1. 創建一個名為keywords的新變量,它可以指向數組列表。
  2. 制作一個新的 arraylist object。
  3. 將對這個新創建的 object 的引用分配給keywords變量。
  4. 然后將該引用扔掉,並使其創建 object 即時垃圾,然后立即為其分配一些其他引用。

換句話說,那個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 名字很重要。 當他們撒謊時,你的代碼就會變得不可讀。

您正在將字符串列表轉換為包含所有值的單個字符串,並用逗號分隔。 這聽起來像是一份普通的工作。 當某些事情聽起來很常見時,請搜索 web。 你通常會發現有一個單行。 所以它在這里:

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

哦,那是更少的代碼。


keywordChecker方法

它有助於記錄代碼,尤其是在尋求幫助時。 顯然,這個方法是掃描提供的title變量,並搜索任何一個關鍵字列表,然后返回每個匹配的關鍵字。 但是,您最多只能返回 3 個。我想您不希望這樣。 但如果你這樣做,我會告訴你怎么做,當然是單線。

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

當你開始像這樣命名變量時,停止。 沒有辦法是正確的。 想一想。 你已經在使用它們,你知道如何正確地做到這一點: Lists 一旦你使用了一個列表,這幾乎是微不足道的。 此外,方法名稱通常應該是動詞; 常見的 java 樣式。 讓我們也使常數,好吧,常數。 讓我們也避免使用 arrays,它們既笨重又煩人。

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;
}

您可以嘗試在一個 for 循環中完成所有操作。 另外,我建議您使用 HashSet,因為您正在比較元素。 HashSet 不能包含重復的元素,因此如果您嘗試添加一個已經存在的元素,它不會這樣做並返回 false(是的,在 HashSet 中添加 function 返回一個布爾值)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM