2013-07-31 5 views
0

У меня есть NSString, который возвращает список значений, как это:NSString разбор конкретных значений

test_1=value_1 
test/2=value_2 
test3=value_3 value_4 
test_4=value_5/value_6 
... 

Более реалистичные значения результат:

inameX=vlan2  
hname=server  
lanipaddr=192.168.1.1  
lannetmask=255.255.255.0  
islan=0  
islwan=0  
dhcplease=604800  
dhcplease_1=302400 
ct_tcp_timeout=0 1200 40 30 60 60 5 30 15 0 
ct_timeout=10 10 
ct_udp_timeout=25 60 
ctf_disable=1  
ddnsx0= 
cifs2=0<\\192.168.1.5 
and so on... 

Если я делаю:

for (id key in dict) { 
      NSLog(@"key: %@, value: %@", [dict objectForKey:key], key); 
     } 

выходы:

key: inameX, value: vlan2 
key: hname value: server  
key: lanipaddr value: 192.168.1.1  
key: lannetmask value: 255.255.255.0 

Этот список хранится в одном результате NSString *. Не уверен, должен ли я помещать его в массив для этого, но мне нужно иметь возможность вызывать функцию или команду, которая вернет определенное значение_X на основе аргумента для соответствия переменной. Например, получите значение переменной test_1, после чего оно вернет значение_1. Или получите test_4, тогда он вернет значение_5/значение_6

Любая идея, как я могу это сделать?

Я ценю вашу помощь. Благодаря!

+1

Звучит как домашнее задание. Можете ли вы более четко понять, что вы пытаетесь сделать, и я попытаюсь изложить шаги по его выполнению? Что именно вы входы и выходы? Вы должны анализировать строку для операторов (*/- +)? Как вы определяете, когда заканчивается один тест, и начинается следующее? – JeffRegan

+0

Не домашнее задание. Я просто пытаюсь научиться взаимодействовать с сервером Linux и получать значения, выполняя команды. Вывод определенной команды будет отображаться, как я писал изначально в NSString.Я просто хочу сказать, что получить значение test_1, чтобы я мог вывести его в значение UILabel_1, я отправляю NSString * result = [ConnectIt executeIt: TextBox.text]; Результат показан как список выше. значения могут быть целыми или некоторое имя – Squirrel

+0

@JeffCompton любая помощь для разбора списка вверх будет оценена. – Squirrel

ответ

0

Используйте NSDicationary. NSDictionaries - это хранилища ключевых значений. Другими словами, есть список ключей. Каждый ключ уникален. Каждый ключ имеет ассоциированное значение. Значение может быть любым типом данных, и ключ должен соответствовать протоколу NSCopying (как правило, NSString). Если вы попытаетесь получить доступ к значению для ключа, которого нет в NSDictionary, возвращаемое значение будет равно нулю.

//create the dictionary and populate it 
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setObject:@"value_1" forKey:@"key_1"]; 
[dict setObject:@"value_2" forKey:@"key_2"]; 
[dict setObject:@"value_3" forKey:@"key_3"]; 
[dict setObject:@"value_4" forKey:@"key_4"]; 


NSString *stringInput = [self getStringInput];//however you find out your input 

//find your string value based on the key passed in 
NSString *strValue = [dict objectForKey:stringInput]; 
+0

Я мог бы использовать это, но эти значения изменяются динамически, потому что test_1 теперь имеет значение_1, но значение_8 через 5 минут, если я перезагружу данные. В основном каждый раз, когда я перезагружаю результат NSString *, у него будет список с теми же переменными, но с разными значениями. – Squirrel

+0

@Squirrel 'NSMutableDictionary' ... Я не понимаю, почему массив лучше реализует изменяемые словари. –

+0

Я думаю, вы имеете в виду 'setObject: forKey:', а не 'setValue: forKey:', и ключ не должен быть NSString; он просто должен соответствовать протоколу NSCopying. –

2

Вы, вероятно, хотите метод в NSString называется componentsSeparatedByCharactersInSet: разделить эту одну строку в массив. Так как ваши значения разделяются «=» и символы новой строки («\ п»), вы хотите, чтобы набор включить эти два символа:

NSArray *strings = [NSString componentsSeparatedByCharactersInSet: 
         [NSCharacterSet characterSetWithCharactersInString:@"=\n"]]; 

И тогда вы можете сделать это в словарь с NSDictoinary-х dictionaryWithObjects: AndKeys: Но во-первых, вам нужно разбить этот массив на два массива; одна с объектами, одна с ключами:

NSMutableArray *keys = [NSMutableArray new]; 
    NSMutableArray *values = [NSMutableArray new]; 
    for (int i = 0; i < strings.count; i++) { 
     if (i % 2 == 0) { // if i is even 
      [keys addObject:strings[i]]; 
     } 
     else { 
      [values addObject:strings[i]]; 
     } 
    } 

Затем вы кладете их в NSDictonary

NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys]; 
NSLog(@"%@", dict[@"test_1"]) // This should print out 'value_1' 

Надежда, что помогает!

+0

Вы правы, я забыл, какой объект использует этот метод, исправил это. Однако я создавал NSSet с объектом, '@ ['=', '\ n']' является объектом NSArray. –

+0

Это не работает. Я получаю плохой exec. 'NSString * Результат = [ConnectIt executeIt: TextBox.Text];' ' NSArray * строки = [результат componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: @ "= \ п"]];' ' NSDictionary * Dict = [NSDictionary dictionaryWithObjectsAndKeys : string]; ' ' NSLog (@ "% @", dict [@ "test_1"]); ' – Squirrel

+0

Последнее редактирование должно работать для вас. Я забыл, что вы не можете поместить массив в 'dictionaryWithObjectsAndKeys:'. –

0

Вы можете использовать NSScanner для выполнения этой работы.

Сканировать строку, для которой требуется значение, а затем отсканировать строку до тех пор, пока вы не столкнетесь с \ n, а затем используйте ее для вашего требования.

NSScanner *scan =[NSScanner scannerWithString:theString]; 
[scan scanString:keyString inToString:nil]; 
[scan setScanLocation:[scan scanLocation]+1]; 

[scan scanString:@"\n" inToString:requiredString]; 

So requiredString - это строка, которую вы хотите.

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