To nie jest zadanie domowe. To pytanie zostało zadane jednemu z moich znajomych w teście na rozmowę kwalifikacyjną.lista mapowania ciągu w hierarchiczną strukturę obiektów
Mam list
linii odczytanych z pliku jako dane wejściowe. Każda linia ma identyfikator na początku linii (A, B, NN, C, DD). W zależności od identyfikatora, muszę zmapować listę rekordów do pojedynczego obiektu A
, który zawiera hierarchiczną strukturę obiektów.
Opis Hierarchia: Każdy A
może mieć zero lub więcej B
typy. Każdy identyfikator B
może mieć zero lub więcej NN
i C
jako dziecko. Podobnie każdy segment C
może mieć zero lub więcej NN
i DD
podrzędnych. Abd każdy DD
może mieć zero lub więcej NN
jako dziecko.
klas mapowanie i ich hierarchia:
Cała klasa będzie mieć value
do przechowywania wartości String
z bieżącej linii.
**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;
}
}
co zrobiłem do tej pory:
Sposób public A parse(List<String> lines)
odczytuje listę wejściowe i zwraca obiekt A
. Ponieważ może istnieć wiele różnych B
, stworzyłem osobny sposób, aby analizować każde wystąpienie.
Metoda parseB, wykonuje pętle przez i = startIndex + 1 to i < lines.size()
i sprawdza początek linii. Występowanie "NN" jest dodawane do bieżącego obiektu B
. Jeśli na początku wykryte zostanie "C", wywoła to inną metodę: parseC
. Pętla zostanie przerwana, gdy na początku wykryjemy "B" lub "A".
Podobna logika jest używana w 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
}
}
Moja logika nie działa poprawnie. Czy istnieje inne podejście, które możesz wymyślić? Czy masz jakieś sugestie/usprawnienia na mojej drodze?
„Moja logika nie działa”. To zdanie przekazuje zero informacji. Proszę wyjaśnić, jakich rezultatów się spodziewasz, co otrzymujesz i dlaczego uważasz, że powinieneś otrzymać te pierwsze, a nie drugie. –