2014-09-04 52 views
0

我正在編寫一個程序來根據產品標題生成html元數據。所有程序要求的(目前)是產品標題和其他2個細節。這是當前不正確的輸出:if(string.contains)在最終輸出中混合變量放置

Please paste model title. 

(我的輸入:布加迪威龍1:18藍)

<METANAME="DESCRIPTION"CONTENT="Shop for Bugatti diecast model cars at [WEBSITE REMOVED]"> 
<METANAME="ABSTRACT"CONTENT=Shop for diecast model cars at [WEBSITE REMOVED]. 
<METANAME="KEYWORDS"CONTENT=「diecast cars, diecast quality scale cars, 
diecast model cars, model cars, collectible cars, Veyron diecast model, quality diecast cars, diecast 1:18"> 

我希望是:

Please paste model title. 

(我的輸入:布加迪威龍1:18藍色)

<METANAME="DESCRIPTION"CONTENT="Shop for Bugatti Veyron 1:18 Blue diecast model cars at [WEBSITE REMOVED]"> 
<METANAME="ABSTRACT"CONTENT=Shop for diecast model cars at [WEBSITE REMOVED]. 
<METANAME="KEYWORDS"CONTENT=「diecast cars, diecast 1:18 scale cars, 
diecast model cars, model cars, collectible cars, diecast model, Bugatti diecast cars, diecast Veyron"> 

請注意,標題的差異不是標題,只是一個字。規模在年底,而不是它應該是說,等

的代碼,在截短的方式,以避免張貼300+臺詞是:

import java.util.Scanner; 
public class MetagenV3 { 

public static void main (String[] args) { 

    Scanner sc = new Scanner(System.in); 
    String title; 
    String abstr = "Shop for diecast model cars at [WEBSITE REMOVED]"; 
    String scale; 
    String diecastManu; 
    String metaModel; 
    String metaMake; 
    String defaultstring = "quality"; 

    String[] metaMakesList = {"Abarth", "Acura", "Ahrens", "Alfa Romeo" 
      +"Alpine Renault", "AMC", "American LaFrance", "Aprilia", "Aston Martin" 
      +"Audi", "Austin", "Austin-Healey", "Bedford", "Benelli", "Bentley", "BMW" 
      +"Buffalo", "Bugatti", "Buick","Cadillac","Caterham", "Chaparrel" 
      + "Checker","Chevrolet","Chrysler","Citroen", "Cleveland", "Cord","DAF" 
      + "Daimler","Dakota","Datsun","Dauer"}; // ETC ETC 

    String[] scaleList = {"1:12","1:18","1:24","1:32","1:43","1:64"}; // ETC ETC 

    System.out.println("Please paste model title."); 
    title = sc.next(); 

    if (title.toLowerCase().contains(metaMakesList[0].toLowerCase())) 
    { metaMake = metaMakesList[0];} 
    if (title.toLowerCase().contains(metaMakesList[1].toLowerCase())) 
    { metaMake = metaMakesList[1];} 
    if (title.toLowerCase().contains(metaMakesList[2].toLowerCase())) 
    { metaMake = metaMakesList[2];} 
    if (title.toLowerCase().contains(metaMakesList[3].toLowerCase())) 
    { metaMake = metaMakesList[3];} 
    if (title.toLowerCase().contains(metaMakesList[4].toLowerCase())) 
    { metaMake = metaMakesList[4];} 
    if (title.toLowerCase().contains(metaMakesList[5].toLowerCase())) 
    { metaMake = metaMakesList[5];} 
    // ETC, ETC 

    else { 
     metaMake = defaultstring; 
    } 

    if (title.toLowerCase().contains(scaleList[0].toLowerCase())) 
    { scale = scaleList[0]; } 
    if (title.toLowerCase().contains(scaleList[1].toLowerCase())) 
    { scale = scaleList[1]; } 
    if (title.toLowerCase().contains(scaleList[2].toLowerCase())) 
    { scale = scaleList[2]; } 
    if (title.toLowerCase().contains(scaleList[3].toLowerCase())) 
    { scale = scaleList[3]; } 
    // ETC, ETC 

    else { scale = defaultstring;} 

    System.out.println("Please paste model manufacturer."); 
    diecastManu = sc.next(); 
    System.out.println("Please paste car model (e.g Skyline"); 
    metaModel = sc.next(); 


String fullOutput = "<METANAME=" + "\"DESCRIPTION\"" + "CONTENT=\"" + "Shop for " + title + " " 
     + "diecast model cars at [WEBSITE REMOVED]\"" +">" + "\n" 
      + "<METANAME=" + "\"ABSTRACT\"" + "CONTENT=" + abstr + "\n" 
     + "<METANAME=" + "\"KEYWORDS\"" + "CONTENT=" + "「diecast cars, diecast " + scale + " " 
       + "scale cars," + "\n" + "diecast model cars, modelcars, collectable cars, " 
     + diecastManu + " diecast" 
         + " model, " + metaMake + " diecast cars, diecast " + metaModel +"\">"; 

System.out.println(fullOutput); 

} 

}

此外,它也忽略:

System.out.println("Please paste model manufacturer."); 
     diecastManu = sc.next(); 
     System.out.println("Please paste car model (e.g Skyline"); 
     metaModel = sc.next(); 

我知道這個問題很長,不是很簡單,但我想不出一個更好的方式來顯示發生了什麼事情。

+1

你有很多if語句,但沒有else-if語句。 – Makoto 2014-09-04 15:35:07

+0

更換if轉換開關會更乾淨嗎?我無法弄清楚如何。 – BenjaminJB 2014-09-04 15:35:56

+1

您應該查看'Scanner.next()'的文檔。 http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#next()。你對'next()'的調用只返回第一個單詞。您還應該嘗試通過調試器來運行它,查看從輸入中存儲的實際值,以及正在命中哪些if語句。 – forgivenson 2014-09-04 15:36:36

回答

1

看起來您的問題存在多個層次,但您提到標題的第一個問題很簡單。

此代碼

System.out.println("Please paste model title."); 
title = sc.next(); 

僅將在第一字讀。 Scanner.next()只會根據分隔符(默認空間)讀取第一個標記。

我建議你用某種類型的調試器(如果有的話)遍歷代碼。如果不這樣做,您應該添加一些打印語句以幫助查看代碼正在執行的操作。

例如,如果添加

System.out.println("Please paste model title."); 
title = sc.next(); 
System.out.println("Title: " + title); 

你會立即看到的問題是程序不正確讀取輸入。

此外,這解釋了爲什麼它似乎忽略製造商和汽車模型提示。它正在從模型標題中讀取剩餘的令牌。

UPDATE(見註釋) 的最後一個else總是觸發

if (title.toLowerCase().contains(scaleList[2].toLowerCase())) 
{ scale = scaleList[2]; } 
if (title.toLowerCase().contains(scaleList[3].toLowerCase())) 
{ scale = scaleList[3]; } 
else { scale = defaultstring;} 

假設scaleList [2]是正確的。它會將scale設置爲scaleList [2],然後它將評估下一個if語句。這將是錯誤的,檢測else塊並運行。正確的方法來構建這些相關的if語句是

if (title.toLowerCase().contains(scaleList[2].toLowerCase())) 
{ scale = scaleList[2]; } 
else if (title.toLowerCase().contains(scaleList[3].toLowerCase())) 
{ scale = scaleList[3]; } 
else { scale = defaultstring;} 

這樣,只要找到正確的比例,將停止嘗試匹配尺度(這也是相關的生產)。

+0

現在更有意義。我在標題上使用了.nextLine方法,將問題排序。現在唯一的問題是,它忽略了每次語句和跳轉到默認值的比例。 if語句有問題嗎?他們是否需要一個else-if子句? – BenjaminJB 2014-09-04 15:47:12

+0

如果條件應該構造成if-else塊,則相關。發生的事情是最後的總是觸發。我將更新我的答案 – Vlad274 2014-09-04 15:52:32

+0

作爲我以前的評論的編輯,仍然沒有任何工作與if語句和程序仍然失敗。我將它改爲這個結構:if,else if,else if [etc] else。這種情況適合嗎? – BenjaminJB 2014-09-04 15:57:55