stringBuilder杀死了我的大脑

时间:2018-04-28 19:52:11

标签: java stringbuilder

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

1 个答案:

答案 0 :(得分:0)

  1)有人建议找到“。”的索引。并附加“-norm”,因此输出文件将是用户输入的任何文件名,附加“-norm”但在“。”之前。

因此,您不确定从colors.txtcolors-norm.txt或从foo.txtfoo-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)后,这应该不是一个大问题