2016-08-05 4 views
0

Java에서 분리 문자로 | 인 char []를 분리하고자하는 상황이 있습니다.자바에서 구분 기호를 사용하여 char []를 별도의 char []로 분할

result1 = {'a','r'} 
result2 = {'t','i'} 
result3 = {'s','t'} 

참고 : 구분 발생이 고정되어 보안상의 이유로 내가 -이 : 예 :

char[] input = { 'a', 'r', '|','t', 'i', '|','s', 't' }; 

주어진 입력 문자 배열과 같은 3 개 가지 문자 배열에 분할한다 여기서 문자열을 사용할 수 없습니다.

어떻게하면 자바에서이 작업을 수행 할 수 있습니까?

+0

그래서 ...배열을 읽는 법을 모르십니까? 배열을 만드는 방법? 문자를 비교하는 방법? 문제가 정확히 무엇입니까? – shmosel

+0

결과 배열은 모두'result' {number}로 명명 될까요? 예 :'result4','result5' 등 – brijs

답변

0

글쎄, 만약 당신이 얼마나 새로운 char []이 될지 모르겠다면 그렇게 될 것이라고 생각합니다. 귀하의 컴파일러는 얼마나 많은 char [] (네가 생각하고 접근 할 수있는) 네가 필요로하는지 알 필요가있다.

첫 번째 아이디어는 문자열에 연결하고 구분 기호 char을 사용하여 분할하는 것이 었습니다. 그러나 당신은 끈을 사용하고 싶지 않거나 할 수 없다고 썼다.

다소 문제를 해결할 수 있지만 char [] 배열 배열을 만들 수 있습니다. for 또는 forach를 사용하여 기본 배열의 요소에 해당 문자를 추가합니다.

내가 찾고있는 것이거나 더 구체적인 질문을 추가하지 않으려는 경우 의견을 보내주십시오.

0

나는이 결과가 List<char[]>에있는 결과 char 배열을 수집하여 가장 잘 해결된다고 생각합니다 (분할 수를 미리 알고 있더라도).

분할 자체는 입력 배열을 단계별로 진행하고 문자를 구분 기호와 비교하여 수행 할 수 있습니다. 구분 기호가 있으면 현재 위치와 마지막으로 발견 된 구분 기호의 위치 사이의 문자 시퀀스를 새로운 char[]으로 추출하고이를 목록에 추가합니다. 입력 배열의 끝에 도달 할 때까지 반복하십시오.

미리 분할 수를 알고있는 경우 char[][]을 미리 할당 할 수 있지만 다음에 추출 할 char[]을 삽입 할 위치를 추적해야합니다.

0

구분 기호의 색인 만 추적하면 새 문자 배열에 해당 문자를 할당 할 수 있습니다.

예를 들어, 당신은 다음과 같이 몇 가지 코드를 시도 할 수 있습니다 :

import java.util.Arrays; 
import java.util.ArrayList;; 
public class Test { 
public static void main(String[] args) { 
    char[] input = { 'a','i', '|','s', 'r','d', '|','t', 'c','i', '|','s', 't' }; 

    int[] indexOfDelimiter=new int[input.length]; 
    indexOfDelimiter[0]=-1; 
    int j=1; //track of delimiter index 
    for (int i=0;i<input.length;i++){ 
     if (input[i]=='|'){ 
      indexOfDelimiter[j++]=i; // get the position of the delimiter 
     } 
    } 
    indexOfDelimiter[j]=input.length; 

    //now you can get the result char arrays like: 
    ArrayList<char[]> results=new ArrayList<>(); 
    for(int i=0;i<j;i++){ 
     char[] chars=Arrays.copyOfRange(input,indexOfDelimiter[i]+1, indexOfDelimiter[i+1]); 
     results.add(chars); 
    } 

    //for retrieving the char arrays, you can do like this: 
    for(int i=0;i<results.size();i++){ 
     System.out.println(results.get(i)); 
    } 
    // the output is : 
    // ai 
    // srd 
    // tci 
    // st 
    } 
} 
0

자바 8 구조 난독에!

import java.util.ArrayList; 
import java.util.List; 
import java.util.Spliterator; 
import java.util.function.Consumer; 

public class Test { 
    public static void main(String[] args) { 
     char[] input = { 'a', 'r', '|','t', 'i', '|','s', 't' }; 

     List<Spliterator<Character>> spliterators= new DelimiterSpliterator(input, '|').tryAllSplits(); 

     List<char[]> splits= spliterators.stream().collect(ArrayList<char[]>::new, (result, element) -> result.add(((DelimiterSpliterator) element).toCharArray()), ArrayList<char[]>::addAll); 

     for (char[] split : splits) { 
      System.out.println(split); 
     } 
    } 
} 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Spliterator; 

public class DelimiterSpliterator implements Spliterator<Character> { 
    private final char[] array; 
    private final char delimiter; 
    private int start; 
    private final int end; 

    public DelimiterSpliterator(char[] array, char delimiter) { 
     this(array, delimiter, 0, array.length); 
    } 

    private DelimiterSpliterator(char[] array, char delimiter, int start, int end) { 
     this.array = array; 
     this.delimiter = delimiter; 
     this.start = start; 
     this.end = end; 
    } 

    public char[] toCharArray() { 
     return Arrays.copyOfRange(array, start, end); 
    } 

    public List<Spliterator<Character>> tryAllSplits() { 
     // Collects all splits. 
     List<Spliterator<Character>> result = new ArrayList<>();    
     Spliterator<Character> s = trySplit(); 
     while (s != null) { 
      result.add(s); 
      s = trySplit(); 
     } 
     result.add(this); 
     return result; 
    } 

    @Override 
    public int characteristics() { 
     return IMMUTABLE | ORDERED | SIZED | SUBSIZED; 
    } 

    @Override 
    public long estimateSize() { 
     return end-start; 
    } 

    @Override 
    public boolean tryAdvance(Consumer<? super Character> action) { 
     if (start < end) { 
      action.accept(array[start++]); 
      return true; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public Spliterator<Character> trySplit() { 
     // Returns a new Spliterator that cannot be split further, from left to right. 
     for (int i = start; i < end - 1; i++) { 
      if (array[i] == delimiter) { 
       final int origStart = start; 
       start = i + 1; 
       return new DelimiterSpliterator(array, delimiter, origStart, i); 
      } 
     } 
     return null; 
    } 
} 

참고 : 관련 가능한 성능 문제 자동 권투 언급 in the javadoc로/언 박싱.
입력이 크고 특히 결과 순서가 중요하지 않은 경우 스트림이 양호합니다 (스트림이 병렬이거나 trySplit이 덜 결정적 일 수 있음)

관련 문제