2016-07-21 9 views
0

Я хочу преобразовать строку в соответствующий битвектор в соответствии с символьной битватой (заданной пользователем). Я имею дело с строкой генома, где у меня есть только 4 символа, то есть A, G, C, T. Я хочу, чтобы представить их следующим bitvalue в JavaПреобразование строки в битвектор в java

A = 01 
G = 11 
C = 10 
T = 00 

Теперь дано String «AGGT», то соответствующая bitvalue должно быть 01111100. я попытался сделать это следующим образом:

BitSet A = new BitSet(2); 
BitSet G = new BitSet(2); 
BitSet C = new BitSet(2); 
BitSet T = new BitSet(2); 
A.set(01); 
G.set(00); 
C.set(11); 
T.set(10); 

String p = "AGGT"; 
BitSet bb = new BitSet(); 
for(int i = 0, n = p.length() ; i < n ; i++) { 
    bb.set(p.charAt(i))  
} 

Что я делаю неправильно? Как это сделать правильно?

+0

Вы хотите только представление строки или номер? – fge

+0

Вероятно, вы не читали JavaDoc в «BitSet». В качестве примера 'A.set (01)' должно быть 'A.set (1)', т. Е. Вы просто устанавливаете бит в индекс 1, оставляя первый бит с индексом 0 unset/0. – Thomas

ответ

0

Как отметил @Thomas, BitSet.set(int) не работает, как вы, вероятно, ожидаете.

public void set(int bitIndex) 

Устанавливает бит по указанному индексу в действительности.

Итак: G.set(00) не устанавливает два бита G к 0: она устанавливает второй бит (в положении 1) G к true.

Но вы не используете исходные биты, которые вы изначально создаете: если вы столкнулись с A в строке, вы фактически устанавливаете 66-й бит (в позиции 65) на true, так как 65 - целочисленное значение символ лит. 'A'.


Проще всего было бы просто сделать выключатель в цепи:

Bitset bb = new BitSet(2 * p.length()); 
for (int i = 0; i < p.length(); ++i) { 
    switch (p.charAt(i)) { 
    case 'A': 
     bb.set(2*i + 0, false); 
     bb.set(2*i + 1, true); 
     break; 
    case 'G': 
     bb.set(2*i + 0, false); 
     bb.set(2*i + 1, false); 
     break; 
    // etc. 
    } 
} 

(Установка битов в false не является необходимым, но это только немного более явным).

 Смежные вопросы

  • Нет связанных вопросов^_^