stringBuilder убил мой мозг - PullRequest
       6

stringBuilder убил мой мозг

0 голосов
/ 28 апреля 2018

Я новичок в Java, и сейчас пытаюсь работать со stringBuilder. Мой текущий проект позволит пользователю вводить файл "colors.txt". Я хочу убедиться, что введенная строка верна. Введенная информация: Пришлось заключить в скобки #, но его нужно вынуть и снова ввести в действительный вывод. (#) F3C - действительный, выход (# FF33CCFF) (#) aa4256 - действительный, выход (AA4256FF) (#) ag0933 - недопустимо, потому что «g» не является шестнадцатеричным (#) 60CC - действительный, выход (6600CCFF) 095 - действительный, выход (009955FF) Be0F- действительный, выход (BBEE00FF) (#) AABB05C - недопустимо, для многих символов (7)

Таким образом, вывод в другой файл с именем «-norm» добавляется к имени файла перед точкой «.». Я хочу проверить, является ли введенная строка истинным шестнадцатеричным цветом. Кроме того, выходной результат должен иметь проверенную строку, равную 8, путем удвоения символов, если двойное число не равно 8, к нему необходимо добавить «FF».

Я смог ввести файл без проверки. Он будет читать каждую строку и будет проходить 2 метода (только обучение) для проверки. У меня много проблем с моим кодом. Я могу визуализировать и знать, что я хочу сделать, у меня проблема с переводом этого в код.

Спасибо за вашу помощь!

 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 голосов
/ 29 апреля 2018

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) правильно, это не должно быть большой проблемой

...