2015-06-03 16 views
5

Tôi có vấn đề này mà tôi muốn giải quyết trong java 8,Split và Vòng trong java 8

Tôi có một chuỗi được nối bởi .

A.B.C.D 

Số ký tự trong chuỗi có thể khác nhau .

Tôi có phương thức này, lấy chuỗi là đầu vào và số cấp độ sâu mà nó phải đi, Tôi phải lặp qua số mà tôi nhận được sau khi áp dụng một chuỗi trên chuỗi với "." và chỉ được cấp mức độ sâu

private String getResponse (String str, int level) { 
// for now, simply print the entire string first and then start removing last alphabet of it one by one till the value of level 
// ex : str = A.B.C.D 
// System.out.println("Doing a call with key as = " + str); => should give me A.B.C.D 
// Apply logic of split 
// System.out.println("Doing a call with key as = " + str); => should give me A.B.C 
// Split again 
// System.out.println("Doing a call with key as = " + str); => should give me A.B 
// this should go in loop till we reach the level 
} 

Điều này có thể được thực hiện trong java 8 không?

+1

Vì vậy, câu hỏi của bạn là gì? Bạn đang cố gắng in ra 'A.B.C.D', theo sau là' A.B.C', và cứ thế, với cái cuối cùng là 'A'? Bạn có ý nghĩa gì bởi "mức độ sâu nhất định"? – Gosu

+0

Người cuối cùng có thể không phải là A, tôi nên dừng lại cho đến khi tôi đáp ứng được giá trị của cấp độ. Nếu giá trị của cấp là 2, tôi nên dừng lại ở A.B – Deepak

+0

Nếu mức là 3, 'A.B.C'? Vì vậy, nó giống như số lượng kết nối cuối cùng, tức là '.' trong trường hợp này, nên tương đương với' cấp - 1'? – Gosu

Trả lời

10

Dưới đây là Java-8 giải pháp:

static void getResponse(String input, int level) { 
    Stream.iterate(input, str -> { 
     int pos = str.lastIndexOf('.'); 
     return pos == -1 ? "" : str.substring(0, pos); 
    }).limit(level+1).forEach(System.out::println); 
} 

Nếu bạn biết chắc chắn rằng mức không vượt quá số d OTS, bạn có thể bỏ qua việc kiểm tra:

static void getResponseUnsafe(String input, int level) { 
    Stream.iterate(input, str -> str.substring(0, str.lastIndexOf('.'))) 
      .limit(level + 1).forEach(System.out::println); 
} 
2

Lưu ý: Không giải quyết sử dụng Java 8

public class StringLoop { 

    public static void main(String[] args) { 

     getResponse("A.B.C.D", 2); 

     System.out.println(); 
     getResponse("A.B.C.D", 3); 

    } 

    // Recursive function 
    private static void getResponse (String str, int level) { 

     if(level < 0 || str.equals("")) 
      return; 

     // Prints out the current string 
     System.out.println(str); 

     int lastIndex = str.lastIndexOf("."); 
     if(lastIndex == - 1) 
      lastIndex = 0; 

     // Remove content after last connector 
     // Decrement level 
     getResponse(str.substring(0, lastIndex), level - 1); 
    } 
} 

Output:

A.B.C.D 
A.B.C 
A.B 

A.B.C.D 
A.B.C 
A.B 
A 
2

Nhận xét của bạn đề cập đến sử dụng split(), vì vậy đây là một ví dụ của việc sử dụng split(), Arrays.copyOfRange() (để loại bỏ các lá thư cuối cùng), và String.Join() để đưa kết quả của Arrays.copyOfRange() trở lại với nhau cho cuộc gọi đệ quy tiếp theo.

public static void main(String[] args) { 
    String string = "A.B.C.D"; 
    getResponse(string, 3); 
    System.out.println(); 

    getResponse(string, 2); 
    System.out.println(); 

    getResponse(string, 1); 
    System.out.println(); 
} 

private static void getResponse(String str, int level) { 
    if (level < 0 || str.isEmpty()) 
     return; 

    System.out.println(str); 

    String[] strPieces = str.split("\\."); 
    if (strPieces.length > level) { 
     getResponse(String.join(".", Arrays.copyOfRange(strPieces, 0, strPieces.length - 1)), level - 1); 
    } 
} 

Kết quả:

A.B.C.D 
A.B.C 
A.B 
A 

A.B.C.D 
A.B.C 
A.B 

A.B.C.D 
A.B.C 
5

Không vòng lặp là cần thiết, vì chuỗi có thể được chia thành một mảng trong một String.split cuộc gọi duy nhất. (Lưu ý rằng String.split có một regex.) Để xử lý "cấp", chỉ cần trừ nó khỏi độ dài của mảng chia tách. Thay vì sao chép subrange mảng, chuyển đổi nó thành một danh sách và sử dụng sublist():

String getResponse(String str, int level) { 
    String[] splits = str.split("\\."); 
    if (level < 0 || level > splits.length) { 
     throw new IllegalArgumentException(); 
    } 
    return String.join(".", Arrays.asList(splits).subList(0, splits.length - level)); 
} 

Kết quả của

for (int level = 0; level < 5; level++) { 
     System.out.printf("level %d: %s%n", level, getResponse("A.B.C.D", level)); 
    } 

sẽ

level 0: A.B.C.D 
level 1: A.B.C 
level 2: A.B 
level 3: A 
level 4: 

Lưu ý rằng điều này đòi hỏi Java 8 vì nó yêu cầu String.join(). (Nhưng nó không yêu cầu dòng hoặc thậm chí lambdas!)

1

Nếu bạn chỉ quan tâm đến kết quả String, không cần phải tạo ra các số trung gian String và cũng không chia nhỏ thành nhiều phần.Chỉ cần lặp qua các chỉ số phù hợp trong String và tạo ra một kết quả String:

static String getResponse(String str, int level) { 
    for(int index=str.length(); index>0; index=str.lastIndexOf('.', index-1)) 
     if(level-- == 0) return str.substring(0, index); 
    if(level==0) return ""; 
    throw new IllegalArgumentException(str+" has not enough dots"); 
} 

này không sử dụng bất kỳ tính năng Java 8 nhưng nó cũng khó có thể tưởng tượng như thế nào Java 8 tính năng có thể cải thiện hoạt động đơn giản này ...