2017-01-19 9 views
0

Брать ArrayList строк, состоящих из строк нравится:Как я могу разделить ArrayList строк между буквами и номерами БЕЗ использования метода split?

fewf5677 
kskfj654 
pqoen444 
mgnwo888 

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

SO i'have решил использовать метод subList. Но я не могу найти правильный пример реализации этого правильно. Взгляните на мой код. Ниже приведен метод, который принимает в ArrayList строк в качестве параметра:

public static void splitup(ArrayList<String> mystrings){ 
    mystrings.subList(String[] letters, double numbers); 
} 

Так в целом, как я беру каждую строку из букв и цифр и хранить их в свои собственные строковых массивы? Например, я хочу

fewf 
kskfj 
pqoen 
mgnwo 

быть в их собственной строке вместе с

5677 
654 
444 
888 

быть их собственные числа.

+0

Строки начинаются всегда буквами и заканчиваются цифрами? – Frakcool

+1

Что 'mystrings.subList (String [] буквы, двойные числа);' должен делать в ваших намерениях? Подлистная подпись - это следующий открытый список subList (int fromIndex, int toIndex) ', только принимающий int в качестве входных параметров ... – salvolds

+0

да. всегда. но количество букв и цифр никогда не определяется. поэтому, например, я мог бы иметь строку, которая является «abc123» и «helloeveryoneilovepie987654321» внутри этого ArrayList строк. – user7442193

ответ

0

Вы можете использовать регулярные выражения, как показано в этом answer, а затем проверить по шаблону, как показано в этом answer следующим образом:

import java.util.ArrayList; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class StringSplitter { 

    public static void main(String[] args) { 
     ArrayList<String> myStringsList = new ArrayList<String>(); 
     ArrayList<String> stringsList = new ArrayList<String>(); 
     ArrayList<String> numbersList = new ArrayList<String>(); 

     myStringsList.add("fewf5677"); 
     myStringsList.add("kskfj654"); 
     myStringsList.add("pqoen444"); 
     myStringsList.add("mgnwo888"); 

     for (String s : myStringsList) { 
      String splittedString[] = s.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"); 

      for (String string : splittedString) { 
       Matcher match = Pattern.compile("[0-9]").matcher(string); 
       if (match.find()) { 
        numbersList.add(string); 
       } else { 
        stringsList.add(string); 
       } 
      } 
     } 

     for (String s : numbersList) { 
      System.out.println(s); 
     } 

     for (String s : stringsList) { 
      System.out.println(s); 
     } 
    } 
} 

Этот выход будет:

5677 
654 
444 
888 
fewf 
kskfj 
pqoen 
mgnwo 

Помните, что split() занимает regex как параметр, а не String, и поэтому вы можете сделать что-то вроде приведенного выше кода, чтобы получить желаемый результат.

+0

Выполняется ли это во время выполнения O (n) или O (n^2)? – user7442193

+0

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

0

Что вы пытаетесь сделать, это немного странно. Почему вы пытаетесь перегрузить метод subList?

Один из возможных примеров того, что вы могли бы сделать, - перебрать список mystrings и разделить каждую строку на две переменные. http://crunchify.com/how-to-iterate-through-java-list-4-way-to-iterate-through-loop/

Если вы знакомы с регулярными выражениями, вы можете использовать их.

Если нет, вы можете перебирать символы строки, чтобы отделить буквы от числа. http://java11s.blogspot.com/2012/02/java-program-to-separate-alphabets-and.html

Затем добавить результат в двух отдельных списков List<String> и List<Double> (или, возможно, List<Integers>) или создавать собственные структуры данных.

0

Вы можете попробовать этот способ:

Если мы считаем, что формат вашего ввода является Строка, в которой вы хотите извлечь целые числа, то вы должны протестировать один элемент одним:

Главная

public static void main(String[] a) { 
    List<String> myList = new ArrayList<>(); 
    myList.add("fewf5677"); 
    myList.add("kskfj654"); 
    myList.add("pqoen444"); 
    myList.add("mgnwo888"); 

    List<String> listStrings = new ArrayList<>(); 
    List<Integer> listIntegers = new ArrayList<>(); 

    for (int i = 0; i < myList.size(); i++) { 
     listStrings.add(getStringPart(myList.get(i))); 
     listIntegers.add(Integer.parseInt(getIntegerPart(myList.get(i)))); 
    } 

    System.out.println(listStrings); 
    System.out.println(listIntegers); 

} 

Получить часть строки вашего элемента

private static String getStringPart(String str) { 
    String s = ""; 
    for (int i = 0; i < str.length(); i++) { 
     if (!testInteger(str.charAt(i))) { 
      s += str.charAt(i); 
     } else { 
      break; 
     } 
    } 
    return s; 
} 

Получить Integer часть вашего элемента

private static String getIntegerPart(String str) { 
    String s = ""; 
    for (int i = 0; i < str.length(); i++) { 
     if (testInteger(str.charAt(i))) { 
      s += str.charAt(i); 
     } 
    } 
    return s; 
} 

метод, чтобы проверить, если ваш Обл является и Integer или не

private static boolean testInteger(char str) { 
    try { 
     Integer.parseInt(str+""); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

Выход

[fewf, kskfj, pqoen, mgnwo] 
[5677, 654, 444, 888] 

Надеюсь, это может вам помочь.