2012-02-29 2 views
1

Я получаю кучу строк, и я хотел бы проверить каждый из них, если они соответствуют указанному типу.Сохранение переменной типа в Java

я мог бы сделать это следующим образом:

String[] strings = ...; 
for(int i = 0; i < strings.length; i++) { 
    switch(i) { 
    case 0: 
     try { 
      Integer.parseInt(strings[i]); 
     } catch(Exception e) { 
      valid = false; 
     } 
     break; 
    case 1: 
     break; 
    ... 
    } 
} 

Но так как это должно быть легко добавлять новые условия, я хочу создать что-то вроде этого

Type[] conditions = new Type[2]; 
conditions[0] = int; 
conditions[1] = long; 

, а затем проверить весь StringArray.

Заранее спасибо!

+1

Whats Error ,,, ?? –

+1

Что вы подразумеваете под «проверять каждый из них, если они соответствуют указанному типу»? –

+1

Возможно, вы не должны использовать 'switch' так, как вы. – beerbajay

ответ

1

Я думаю, что, возможно, это то, что вы после этого? Основной код проходит через все строки, а затем запускает каждую возможную «проверку» на этой Строке по очереди. Сам код «check» хранится в массиве, который содержит объекты с единственным методом проверки (String), который переопределяется в строке. Вы можете сделать метод check() делать все, что вам нужно, если оно работает от стандартной подписи, поэтому, если вам нужны проверки регулярного выражения или что-то более сложное, это также будет работать нормально.

public class TestTypes 
{ 
    public static void main(String[] args) 
    { 
     String[] strings = new String[] {"123", "9999999999999", "50.4", "not a number"}; 

     for(String str : strings) 
     { 
     System.out.print("'" + str + "': "); 
      for(TypeChecker checker : typesToCheck) 
      { 
       if(checker.check(str)) 
       { 
        System.out.print(checker.type.getSimpleName() + " "); 
       } 
      } 
      System.out.println(); 
     } 
    } 


    static abstract class TypeChecker 
    { 
     public final Class type; 
     public abstract boolean check(String s); 

     TypeChecker(Class type) 
     { 
      this.type = type; 
     } 
    } 

    // A list of the code for all the checks 
    static TypeChecker[] typesToCheck = 
    { 
      new TypeChecker(Integer.TYPE) // is Integer 
      { 
       public boolean check(String s) 
       { 
        try{Integer.parseInt(s);} 
        catch(Exception e) 
        {return false;} 
        return true; 
       } 
      }, 

      new TypeChecker(Long.TYPE) // is Long 
      { 
       public boolean check(String s) 
       { 
        try{Long.parseLong(s);} 
        catch(Exception e) 
        {return false;} 
        return true; 
       } 
      }, 

      new TypeChecker(Double.TYPE) // is Double 
      { 
       public boolean check(String s) 
       { 
        try{Double.parseDouble(s);} 
        catch(Exception e) 
        {return false;} 
        return true; 
       } 
      }, 
    }; 
} 

Это производит вывод:

'123': int long double 
'9999999999999': long double 
'50.4': double 
'not a number': 

Это решение является много более многословным, и имеет уровень косвенности, который имеет потенциал, чтобы сделать его в заблуждение, так что если вы только получил небольшое количество возможных типов, я бы просто вложил в них массу и спас всех!

Такой подход является действительно хорошим подходом, если у вас есть сложные алгоритмы, которые необходимо запускать в тестах, или если вам нужно настроить, какие тесты выполняются динамически во время выполнения.

1

Предполагая, что ваши чеки коды для 3 типов данных only..Your кода может быть что-то вроде этого:

OUTER: for(int i = 0; i < strings.length; i++) 
    { 

    if(strings[i].contains(".")) 
    { 
    //float ..since a '.' is present 

    continue OUTER; 
    } 

    else 
    { 
    for(int j=0;j<strings[i].length;j++) 
    { 

    if(strings[i].charAt(j).isCharacter()) // string contains a character 
    { 
    //text ...since a character is present 
    continue OUTER; 

    } 
    else 
    { 
    //int ..no character and no '.' hence an int 

    } 

    } 
    }//end of inner for 
    }//end of outer for 
Смежные вопросы