我正在编写一个程序来根据产品标题生成 html 元数据。该程序(目前)要求的只是产品标题和其他 2 个详细信息。这是当前不正确的输出:
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();
我知道这个问题很长而且不是很简单,但我想不出更好的方法来展示正在发生的事情。
最佳答案
看起来您的问题有多个层次,但您提到的第一个问题的标题很简单。
这段代码
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);
您将立即看到问题是程序未正确读取输入。
此外,这解释了为什么它似乎忽略制造商和汽车型号提示。它正在从模型标题中读取剩余的标记。
更新(见评论) 最后的 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 block 并运行它。构建这些相关 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;}
这样,一旦找到正确的比例,它将停止尝试匹配比例(这也与您的品牌相关)。
关于java - if (string.contains) 在最终输出中混合变量放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25669445/