2012-03-25 5 views
4

что я делаю неправильно здесь? Я хочу как-то удалить пустые элементы в моем массиве String. Это то, что я не пытался до сих пор:копирование массив строк в новый массив строк

String version = null; 
    String[] xml = new String[str.length]; 
    for(int i = 0; i <= str.length -1; i++) 
    { 
     if(str[i] == "") 
     { 

     } 
     else 
     { 
      xml[i] = str[i]; 
     } 
    } 






    String version = null; 
    String[] xml = new String[str.length]; 
    for(int i = 0; i <= str.length -1; i++) 
    { 
     if(!str[i].equals("")) 
     { 
      xml[i] = str[i]; 
     } 
    } 



    String version = null; 
    String[] xml = new String[str.length]; 
    for(int i = 0; i <= str.length -1; i++) 
    { 
     if(!str[i].isEmpty()) 
     { 
      xml[i] = str[i]; 
     } 
    } 




    String version = null; 
    String[] xml = new String[str.length]; 
    for(int i = 0; i <= str.length -1; i++) 
    { 
     if(str[i].isEmpty() == false) 
     { 
      xml[i] = str[i]; 
     } 
    } 

независимо от того, какой из них я стараюсь, она всегда идет в копируя все значения: S Я проверил местных жителей, и становится ясно, что есть пустые массивы в пределах Строковый массив

+0

Вы уверены, что в них нет пробелов? – cHao

+2

Кстати, вы понимаете, что в любое время, когда вы не копируете строку, вы оставляете «null» в 'xml [i]', правильно? Одно из последствий использования одного и того же индекса для обоих массивов ... – cHao

+0

Вы уверены, что они пусты (а не только строки, содержащие только пробельные символы)? Возможно, попробуйте обрезать ('str [i] .trim()') перед выполнением сравнения? Обратите внимание, что '==' не то, что вы хотите здесь, но любой из двух других должен работать. –

ответ

7

Вы копируете массив одинаковой длины и используете одни и те же индексы. Длина всегда будет одинаковой.

List<String> nonBlank = new ArrayList<String>(); 
for(String s: str) { 
    if (!s.trim().isEmpty()) { 
     nonBlank.add(s); 
    } 
} 
// nonBlank will have all the elements which contain some characters. 
String[] strArr = (String[]) nonBlank.toArray(new String[nonBlank.size()]); 
+0

Хмм, я использую массив строк, а не список строк. Спасибо в любом случае – BigBug

+0

hmm, добавлена ​​строка для преобразования одного в другой. ;) –

+0

:) спасибо, проблема решена – BigBug

0
String str[] = {"Hello","Hi","","","Happy","","Hmm"}; 
    int count = 0;// Thisreprents the number of empty strings in the array str 
    String[] xml = new String[str.length]; 
    for(int i = 0,j=0; i <= str.length -1; i++) 
    { 
     if(str[i].equals("")) 
     { 
      count++; 
     } 
     else 
     { 
      xml[j] = str[i];j++; 
     } 
    } 
    String a[] = Arrays.copyOfRange(xml, 0, xml.length-count);//s is the target array made by copieng the non-null values of xml 
    for(String s:a){ 
     System.out.println(s); 
    } 

Примечание: Это не может быть эффективным решением, но это даст результат в соответствии с вашими требованиями

0

Это просто альтернативное решение, так как вы не хотите ListArray. Прочтите комментарии в коде, чтобы четко понять логику.

int i,j=0,cnt=0; 

//The below for loop is used to calculate the length of the xml array which 
//shouldn't have any empty strings. 

for(i=0;i<str.length;i++) 
if(!isEmpty(str[i]) 
cnt++; 

//Creation of the xml array with proper size(cnt) and initialising i=0 for further use 
String xml[]=new String[cnt]; 
i=0; 

//Simply copying into the xml array if str[i] is not empty.Notice xml[j] not xml[i] 
while(i<str.length) 
{ 
if(!isEmpty(str[i])) 
{ 
xml[j]=str[i]; 
i++; 
j++; 
} 
else 
i++; 
} 

Это должно делать работу. Также я бы предложил не работать с 0-й позицией массива, поскольку он создает путаницу для функций .length. Это только мой взгляд. Если вам это нравится, продолжайте! : D

0

Если вы ищете высокопроизводительное решение, я думаю, что это лучшее решение. В противном случае, если ваш входной массив не такой огромный, я бы использовал решение, аналогичное решению Peter Lawrey, поэтому ваш код легко понять.

С помощью этого решения вы производите цикл ввода только один, и если вам не нужен входной массив, вы можете избежать одного экземпляра, который вызывается вызовом filterBlankLines с preserveInput = false.

public class CopyingStringArrayIntoNewStringArray { 


public static void main(String[] args) { 

    String[] str = { "", "1", "", null, "2", " ", "3", "" }; 

    System.out.println("\nBefore:"); 
    printArrays(str); 

    String[] xml = filterBlankLines(str, true); 

    System.out.println("\nAfter:"); 
    printArrays(xml); 

} 

private static String[] filterBlankLines(String input[], boolean preserveInput) { 

    String[] str; 
    if (preserveInput) { 
     str = new String[input.length]; 
     System.arraycopy(input, 0, str, 0, input.length); 
    } else { 
     str = input; 
    } 

    // Filter values null, empty or with blank spaces 
    int p=0, i=0; 
    for (; i < str.length; i++, p++) { 
     str[p] = str[i]; 
     if (str[i] == null || str[i].isEmpty() || (str[i].startsWith(" ") && str[i].trim().isEmpty())) p--; 
    } 

    // Resize the array 
    String[] tmp = new String[ p ]; 
    System.arraycopy(str, 0, tmp, 0, p); 
    str = null; 

    return tmp; 
} 

private static void printArrays(String str[]) { 

    System.out.println("length " + str.length); 
    for (String s : str) { 
     System.out.println(">"+s+"<"); 
    } 

} 

}

Выход:

Before: 
length 8 
>< 
>1< 
>< 
>null< 
>2< 
> < 
>3< 
>< 

After: 
length 3 
>1< 
>2< 
>3< 
9

Попробуйте это,

b = Arrays.copyOf(a, a.length); 

Или

b = new int[a.length]; 
System.arraycopy(a, 0, b, 0, b.length); 

или

b = a.clone(); 
+0

это помогает мне alot – NovusMobile

+0

Хотя этот код может помочь решить проблему, он не объясняет _why_ и/или _how_, он отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшит его долгосрочную образовательную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, включая ограничения и допущения. –

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