我是java的新手,我正在尝试使用stringBuilder。我当前的项目将允许用户输入" colors.txt"文件。我想验证输入的字符串是否有效。输入的信息是: 不得不为#括号,但需要将其取出并重新输入有效输出。 (#)F3C-有效,输出(#FF33CCFF) (#)aa4256-有效,输出(AA4256FF) (#)ag0933 - 无效,因为' g'不是十六进制的 (#)60CC-有效,输出(6600CCFF) 095-有效,输出(009955FF) Be0F-有效,输出(BBEE00FF) (#)AABB05C-无效,对很多字符(7)
所以输出到另一个名为" -norm"的文件附加到点"之前的文件名。"。我想验证输入的行是否是真正的十六进制颜色。此外,如果双倍不等于8则输出必须使验证线等于8加倍,然后" FF"必须附加到它。
我无需验证即可输入文件。它将读取每一行并通过两种方法(只是学习)进行验证。我的代码存在很多问题。我可以想象并知道我想要做什么,我遇到了将问题转化为代码的问题。
感谢您的帮助!
import java.util.*; // for Scanner
import java.io.*; // for File, etc.
import java.lang.*;
//import java.awt.* //to use the color class
public class RGBAColor
{
//Scanner file = new Scanner(new File("colors.txt"));
public static void main(String[] args) //throws IOException
throws FileNotFoundException
{
Scanner console = new Scanner(System.in);
System.out.println("Please make sure you enter the colors.txt ");
//assigning the colors file
String fileName = console.nextLine();
Scanner inputFile = new Scanner(new File(fileName));
//outputing to colors-norm file
int dotLocation;
StringBuilder dot = new StringBuilder(fileName);
dotLocation = dot.indexOf(".");
//PrintWriter FileName =
//new PrintWriter("colors-norm.txt");
while (inputFile.hasNextLine())
{
String currLine = inputFile.nextLine();
int lineLenght = currLine.length();
//System.out.printf("line length is %s \n", currLine);
verification(currLine);
}
inputFile.close();
}
//this will verify the color
public static void verification(String line)
{
StringBuilder newString = new StringBuilder(line);
//will be used to compare the length
int stringLength;
//will remove the # if in string
if (newString.charAt(0) == '#')
{
newString = newString.deleteCharAt(0);
}
//assigns the length
stringLength = newString.length();
//checks the length of the string
//prompt will show if the number of digits is invalid
if (!(stringLength == 3 || stringLength == 4 || stringLength == 6 || stringLength == 8))
{
System.out.println("invalid number # of digits " + stringLength + " in "
+ newString);
}
StringBuilder errorLessString = new StringBuilder("");
//checks number and letter for valid entries for hexadecimal digit
for (int i = 0; i < newString.length(); i++ )
{
char valid = newString.toString().toUpperCase().charAt(i);
if (!(valid >= '0' && valid <= '9' || valid >= 'A' && valid <= 'F'))
{
System.out.println("invalid color '" + newString.charAt(i) +
"' in " + newString );
}
errorLessString.append(valid);
}
System.out.println("this is the length of " + errorLessString + " " + errorLessString.length());
String resultingString = " ";
// validating length only allowing the correct lengths of 3,4,6,and 8
switch (errorLessString.length())
{
case 3: System.out.println("begin case 3");
dbleAppend(newString.toString());
addFF(newString.toString());
System.out.println("end case 3");
break;
case 4: dbleAppend(newString.toString());
break;
case 6: addFF(newString.toString());
break;
case 8:
}
}
//method to have two characters together
public static String dbleAppend(String appd)
{
StringBuilder charDouble = new StringBuilder("");
//pass in append string to double the characters
for (int i = 0; i < appd.length(); i++)
{
charDouble.append(appd.charAt(i));
charDouble.append(appd.charAt(i));
}
return appd;
}
//method will append ff to string
public static String addFF(String putFF)
{
StringBuilder plusFF = new StringBuilder("FF");
plusFF.append(putFF.toString());
System.out.println(plusFF);
return putFF;
}
}
答案 0 :(得分:0)
1)有人建议找到“。”的索引。并附加“-norm”,因此输出文件将是用户输入的任何文件名,附加“-norm”但在“。”之前。
因此,您不确定从colors.txt
到colors-norm.txt
或从foo.txt
到foo-norm.txt
的最佳方式是什么?
一个选项是找到文件名中(最后一个)点的索引,并在此处拆分文件名并使用这些部分构造新文件名:
String filename = "colors.txt"
int indexOfDot = filename.lastIndexOf(".");
String firstPart = filename.substring(0, indexOfDot); // Will be "colors"
String lastPart = filename.substring(indexOfDot); // Will be ".txt"
return firstPart + "-norm" + lastPart;
更优雅的选择是使用正则表达式:
String filename = "colors.txt"
Matcher filenameMatcher = Pattern.compile("(.*)\\.txt").matcher(filename);
if (matcher.matches()) {
String firstPart = matcher.group(1) // Will be "colors"
return firstPart + "-norm.txt"
} else {
//Invalid input, throw an Exeption and/or show an error message
}
如果允许使用除.txt
之外的其他文件扩展名,则您也必须捕获扩展名。
2)我想验证文本文件以确保它们输入有效文件。我是否必须验证每个单独的部分?还是整个字符串?
最简单的方法是首先分离不同的颜色值,然后验证每个颜色值。您可能希望首先开发语法,因此编写实际代码会更容易。
由于每行只有一个值,您可以使用以下内容:
List<String> outputColors = Files.lines(new File(fileName).toPath())
.filter(line -> isValidColor(line))
.map(validColor -> convertToOutputFormat(validColor))
.collect(Collectors.toList());
Files.write(new File(outputFileName).toPath(), outputColors);
3)写文件也是一个很大的问题,我能够在文件中阅读。
Google是你的朋友:
4)输出文件只能保存有效输入。
正确解决2)后,这应该不是一个大问题