Đây không phải là vấn đề về bài tập về nhà. Câu hỏi này đã được hỏi một người bạn của tôi trong một bài kiểm tra phỏng vấn.ánh xạ danh sách chuỗi thành cấu trúc phân cấp của các đối tượng
Tôi có một dòng list
được đọc từ tệp dưới dạng đầu vào. Mỗi dòng có một định danh như (A, B, NN, C, DD) ở đầu dòng. Tùy thuộc vào định danh, tôi cần ánh xạ danh sách các bản ghi vào một đối tượng đơn lẻ A
có chứa cấu trúc phân cấp của các đối tượng.
Mô tả Hierarchy: Mỗi A
có thể có không hoặc nhiều B
loại. Mỗi số nhận dạng B
có thể có số không bằng hoặc lớn hơn NN
và C
làm con. Tương tự, mỗi phân khúc C
có thể có số không bằng hoặc lớn hơn NN
và DD
con. Mỗi số điện thoại DD
có thể có số không hoặc bằng NN
khi còn nhỏ.
lớp Mapping và hệ thống cấp bậc của họ:
Tất cả các lớp học sẽ có value
để giữ giá trị String
từ dòng hiện tại.
**A - will have list of B**
class A {
List<B> bList;
String value;
public A(String value) {
this.value = value;
}
public void addB(B b) {
if (bList == null) {
bList = new ArrayList<B>();
}
bList.add(b);
}
}
**B - will have list of NN and list of C**
class B {
List<C> cList;
List<NN> nnList;
String value;
public B(String value) {
this.value = value;
}
public void addNN(NN nn) {
if (nnList == null) {
nnList = new ArrayList<NN>();
}
nnList.add(nn);
}
public void addC(C c) {
if (cList == null) {
cList = new ArrayList<C>();
}
cList.add(c);
}
}
**C - will have list of DDs and NNs**
class C {
List<DD> ddList;
List<NN> nnList;
String value;
public C(String value) {
this.value = value;
}
public void addDD(DD dd) {
if (ddList == null) {
ddList = new ArrayList<DD>();
}
ddList.add(dd);
}
public void addNN(NN nn) {
if (nnList == null) {
nnList = new ArrayList<NN>();
}
nnList.add(nn);
}
}
**DD - will have list of NNs**
class DD {
String value;
List<NN> nnList;
public DD(String value) {
this.value = value;
}
public void addNN(NN nn) {
if (nnList == null) {
nnList = new ArrayList<NN>();
}
nnList.add(nn);
}
}
**NN- will hold the line only**
class NN {
String value;
public NN(String value) {
this.value = value;
}
}
Những gì tôi đã làm như vậy Viễn:
Phương pháp public A parse(List<String> lines)
đọc danh sách đầu vào và trả về đối tượng A
. Vì, có thể có nhiều B
, tôi đã tạo phương thức riêng biệt 'parseB
để phân tích từng lần xuất hiện.
Tại phương thức parseB, lặp lại thông qua i = startIndex + 1 to i < lines.size()
và kiểm tra đầu dòng. Sự xuất hiện của "NN" được thêm vào đối tượng hiện tại của B
. Nếu "C" được phát hiện lúc khởi động, nó gọi phương thức khác parseC
. Vòng lặp sẽ ngắt khi chúng tôi phát hiện "B" hoặc "A" khi bắt đầu.
Logic tương tự được sử dụng trong parseC_DD.
public class GTTest {
public A parse(List<String> lines) {
A a;
for (int i = 0; i < lines.size(); i++) {
String curLine = lines.get(i);
if (curLine.startsWith("A")) {
a = new A(curLine);
continue;
}
if (curLine.startsWith("B")) {
i = parseB(lines, i); // returns index i to skip all the lines that are read inside parseB(...)
continue;
}
}
return a; // return mapped object
}
private int parseB(List<String> lines, int startIndex) {
int i;
B b = new B(lines.get(startIndex));
for (i = startIndex + 1; i < lines.size(); i++) {
String curLine = lines.get(i);
if (curLine.startsWith("NN")) {
b.addNN(new NN(curLine));
continue;
}
if (curLine.startsWith("C")) {
i = parseC(b, lines, i);
continue;
}
a.addB(b);
if (curLine.startsWith("B") || curLine.startsWith("A")) { //ending condition
System.out.println("B A "+curLine);
--i;
break;
}
}
return i; // return nextIndex to read
}
private int parseC(B b, List<String> lines, int startIndex) {
int i;
C c = new C(lines.get(startIndex));
for (i = startIndex + 1; i < lines.size(); i++) {
String curLine = lines.get(i);
if (curLine.startsWith("NN")) {
c.addNN(new NN(curLine));
continue;
}
if (curLine.startsWith("DD")) {
i = parseC_DD(c, lines, i);
continue;
}
b.addC(c);
if (curLine.startsWith("C") || curLine.startsWith("A") || curLine.startsWith("B")) {
System.out.println("C A B "+curLine);
--i;
break;
}
}
return i;//return next index
}
private int parseC_DD(C c, List<String> lines, int startIndex) {
int i;
DD d = new DD(lines.get(startIndex));
c.addDD(d);
for (i = startIndex; i < lines.size(); i++) {
String curLine = lines.get(i);
if (curLine.startsWith("NN")) {
d.addNN(new NN(curLine));
continue;
}
if (curLine.startsWith("DD")) {
d=new DD(curLine);
continue;
}
c.addDD(d);
if (curLine.startsWith("NN") || curLine.startsWith("C") || curLine.startsWith("A") || curLine.startsWith("B")) {
System.out.println("NN C A B "+curLine);
--i;
break;
}
}
return i;//return next index
}
public static void main(String[] args) {
GTTest gt = new GTTest();
List<String> list = new ArrayList<String>();
list.add("A1");
list.add("B1");
list.add("NN1");
list.add("NN2");
list.add("C1");
list.add("NNXX");
list.add("DD1");
list.add("DD2");
list.add("NN3");
list.add("NN4");
list.add("DD3");
list.add("NN5");
list.add("B2");
list.add("NN6");
list.add("C2");
list.add("DD4");
list.add("DD5");
list.add("NN7");
list.add("NN8");
list.add("DD6");
list.add("NN7");
list.add("C3");
list.add("DD7");
list.add("DD8");
A a = gt.parse(list);
//show values of a
}
}
Logic của tôi không hoạt động bình thường. Có cách tiếp cận nào khác mà bạn có thể tìm ra không? Bạn có bất cứ gợi ý/cải tiến nào cho tôi không?
"Logic của tôi không hoạt động". Câu này truyền tải thông tin bằng không. Xin giải thích kết quả nào bạn mong đợi, bạn nhận được gì, và tại sao bạn nghĩ rằng bạn nên nhận được cái cũ và không phải là cái sau. –