2014-09-04 2 views
0

Я пишу программу для генерации метаданных html на основе названия продукта. Вся программа запрашивает (на данный момент) название продукта и две другие детали. Это текущий некорректный вывод:if (string.contains) смешение размещения переменных в конечном выпуске

Please paste model title. 

(МОЯ ВХОД: Bugatti Veyron 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. 

(МОЯ ВХОД: Bugatti Veyron 1:18 Blue)

<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, но никаких утверждений if-if. – Makoto

+0

Будет ли чище менять переключатель if? Я не мог понять, как это сделать. – BenjaminJB

+1

Вы должны проверить документацию для 'Scanner.next()'. http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#next(). Ваш вызов 'next()' возвращает только первое слово. Вы также должны попробовать запустить это через отладчик, чтобы увидеть фактические значения, хранящиеся на вашем входе, и какие операторы 'if' будут удалены. – forgivenson

ответ

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 (см комментарий) Конечное еще всегда вызывая

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] является правильным. Он установит масштаб в scaleList [2], затем он будет оценивать следующий оператор if. Он будет ложным, обнаруживает блок else и запускает его.Правильный способ структурировать эти связанный, если заявления является

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 для заголовка, который отсортировал проблему. Теперь единственная проблема заключается в том, что он игнорирует операторы scale if и каждый раз пропускает значение по умолчанию. Что-то не так с утверждениями if? Требуется ли им предложение else-if? – BenjaminJB

+0

Связано, если условия должны быть структурой в блоки if-else. То, что происходит, - это последнее, что всегда срабатывает. Я обновлю свой ответ – Vlad274

+0

Как отредактировать мой предыдущий комментарий, все еще ничего не работает с операторами if, и программа все еще терпит неудачу. Я изменил его на эту структуру: if, else if, else if [etc] else. Это правильно для этого случая? – BenjaminJB

Смежные вопросы