2011-08-07 22 views
0

也许我让这个过于复杂,但我想我需要从右边开始读取一个字符串以查找其位置。 这里是我的示例:Java - 在字符串中查找并从右边开始

10000000000000000101 

在这个字符串,我需要找到所有的“1”,并得到他们的位置。 在这种情况下,将1,3和19

是,一个简单的方法来做到这一点?

谢谢大家。

+0

您的字符串长度为20。因此它将是1,3和20. – Kal

+0

在某些UNIX实用程序中,右侧的位置表示为-1的负数。这样可以很容易地从左侧区分零索引。您可能希望将此惯例应用于您的代码。 – jfg956

回答

3
String mystring = "10000000000000000101"; 
    for(int i=0; i < mystring.length(); i++){ 
     if(mystring.charAt(i) == '1'){ 
      int rightPosition = mystring.length() - i; 
      // do what ever you want with character and its position 
     } 
    } 
+0

在这么短的时间内感谢大家的所有代码。我用了最后一个,这似乎工作得很好,但我相信所有其他代码也很棒。那么现在如何工作?检查他们全部? – Steve

+0

接受解决您的问题的解决方案。 :) – mjisrawi

2

既然你需要找到所有的位置,我不认为你真的需要找到从右到左的位置 - 你可以找到他们的“正常”的指标,只是计算多少位置那会从右边开始。

因此,使用indexOf(int, int)反复,并从字符串的长度减去返回的索引:

public static void showSetBits(String text) 
{ 
    int lastPosition = -1; 
    while ((lastPosition = text.indexOf('1', lastPosition + 1)) != -1) 
    { 
     System.out.println("Found set bit at position " + 
          (text.length() - lastPosition)); 
    } 
} 

如果你要从右到左走,你可以随时使用lastIndexOf

0
String searchString = "10000000000000000101"; 
for (int i = searchString.length; i >= 0; i--) { 
    if (searchString.charAt(i).equals('1')) { 
     System.out.println("" + i); 
    } 
} 

这应该这样做

+0

这将评估从左到右。他想要从右到左。 – Kal

+0

糟糕!我会改变它。 – fireshadow52

+0

即使这个解决方案很好地使用了String的toCharArray方法,我认为分配内存来解决这个问题是浪费资源。 – jfg956

1

使用java.lang.String#indexOf找到从左边的索引。

然后从字符串的长度中减去。

String abc = "10000000000000000101"; 
    int fromIndex = 0; 
    int idx = 0; 
    do { 
     idx = abc.indexOf("1", fromIndex); 
     if (idx == -1) 
      break; 
     System.out.println(abc.length() - idx); 
     fromIndex = idx + 1; 
    } while (idx != -1); 
} 
1

的一种方法是使用reverse方法在StringBuilder类。所以首先我们扭转字符串:

//declare and initialise string 
String str = "10000000000000000101"; 

//First we take an instance of the StringBuilder, then 
//we append the original string to it and lastly we reverse it and get the string value. 
String reversed = new StringBuilder().append(str).reverse().toString(); 

现在,我们已经扭转了字符串的所有,你只需要做的是循环通过串并跟踪在您遇到1索引。您可以轻松使用ArrayList。每次遇到1时,都会将该索引添加到该列表中。

因此,我们首先声明一个泛型类型为Integer的ArrayList,然后循环反向字符串。

ArrayList<Integer> list = new ArrayList<Integer>(); 

//we loop through the string.. 

for(int i=0; i<reversed.length(); i++) 
{ 
    if(reversed.charAt(i) == '1'){ 
     list.add(i); 
    } 
} 

现在您已经有了索引列表,因此您可以将它们打印出来或者做任何你想要的东西。对于像你这样的问题,有几个简短的方法可以做到这一点,但我解释了一个更详细和有效的方法,如果你不知道原始字符串是什么样的话,可以用来解决这个问题(比如说你只是有一个包含数百万行文字的文本文件)

+0

原始问题需要一个索引位置,并且此解决方案给出零索引位置。 – jfg956

+0

即使这个解决方案很好地使用了StringBuilder的逆向方法,我相信分配内存来解决这个问题是浪费资源。 – jfg956

1

@mjisrawi你的代码有一些错误检查。

@steve“:String.charAt(焦炭)可能是找出情况下,一些控制语句内使用时的数最简单的方法。Ofcourse,你可以把它使用其他预配置的方法做这样的indexOf()

String s = "100000000001000000101"; 

int len = s.length(); 
int count =0; 

while (len>0) {  
     if (s.charAt(len-1)=='1'){ 
      count ++;}          
    len --; 
} 
    System.out.println("Number of 1 using String.charAt()" + " = " +count); 
1

可能是最详细的,我能想到的用途String split的:

String str = "10000000000000000101"; 
String[] bits = str.split("1"); 
System.out.println("Number of 1s: " + (bits.length-1)); 

有些人可能会认为这是一个黑客攻击的一位或者效率不高,但对于简单的场景它可以正常工作。

相关问题