2014-03-31 38 views
3

我想從使用Java的Character數組中返回用戶輸入子串的索引。該數組被初始化,加擾,然後被搜索。我是新手,嘗試了兩種不同的方法,但都沒有成功。我忽略了什麼?提前致謝。使用Java在數組中找到子串索引

方法1:

import java.lang.Math; 
import java.util.Scanner; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Collections; 

public class ArrayRandomChar { 
public static void main(String[] args) { 
    // Create an array of characters: 
    Character[] anArray = {'P', 'A', 'P', 'A', 'B', 'E', 'A', 'R'}; 
    for (char ch: anArray) 
    System.out.print(ch + " "); 
    System.out.println(); 

    // Create list from array and shuffle 
    List<Character> aList = Arrays.asList(anArray); 
    Collections.shuffle(aList); 
    System.out.print(aList); 
    System.out.println(); 

    // Bring back into array 
    Object ob[] = aList.toArray(); 
    for (Object ch: anArray) 
    System.out.print((Character) ch + " "); 

    // User input 
    Scanner input = new Scanner(System.in); 
    String letter = input.next(); 
    System.out.println(letter); 

    // Return index of letter, -1 if doesn't contain 
    int retval = aList.IndexOf(letter); 
    System.out.println(retval); 

    } 
     } 

問題:運行文件,輸入字母時,-1返回即使列表包含字母。

方法2:

public class ArrayRandomChar { 
public static void main(String[] args) { 

    // Create an array of characters: 
    Character[] anArray = {'P', 'A', 'P', 'A', 'B', 'E', 'A', 'R'}; 
    for (char ch: anArray) 
     System.out.print(ch + " "); 
    System.out.println(); 

    // Create list from array: 
    List<Character> aList = Arrays.asList(anArray); 
    Collections.shuffle(aList); 
    System.out.print(aList); 
    System.out.println(); 

    //create array from list 
    Object ob[] = aList.toArray(); 
    for (Object ch: anArray) 
     System.out.print((Character) ch + " "); 

    //user input 
    Scanner input = new Scanner(System.in); 
    String letter = input.next(); 
    int index = Arrays.binarySearch(anArray, letter); 
    System.out.println(~index); 
    System.out.println(letter); 

    } 
     } 

這引發異常:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Character 
at java.lang.Character.compareTo(Character.java:101) 
at java.util.Arrays.binarySearch0(Arrays.java:2001) 
at java.util.Arrays.binarySearch(Arrays.java:1943) 
at ArrayRandomChar.main(ArrayRandomChar.java:32) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 
+1

難道你不明白什麼錯誤消息? –

+0

以'at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)'開頭的所有內容' 我想知道這是否可以通過兼容Character的掃描器input.next()來解決。 – user25976

回答

4

這將解決這一問題..

方法1:

int retval = aList.indexOf(letter.charAt(0)); 

方法2:

int index = Arrays.binarySearch(anArray, letter.charAt(0)); 

的問題是,你有一個字符陣列aList,並且letter是一個字符串並且因此搜索字符陣列中的String。哪些可能導致ClassCastException或字符串未找到。

簡而言之:Character A不一樣String A

1

方法1:運行文件和輸入字母時

,則返回-1即使 的列表包含該字母。

OK,這個問題@Dileep已經回答了,

int retval = aList.IndexOf(letter); 

錯誤是,你已經通過了String類型List.indexOf(Object o)是,aList 包含Character類型的所有元素。所以List.indexOf()將始終返回-1。

你可能會改變工作:

int retval = aList.indexOf(Character.toUpperCase(letter.charAt(0))); 

注:Character.toUpperCase()我已經使用,因爲你有大寫的所有元素。


方法2:

拋出

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Character 

異常消息已經回答了,那String不能成爲改變/施放到Character

int index = Arrays.binarySearch(anArray, letter); 

這裏,

  • anArray包含的元素類型的Character

  • 您已通過StringArrays.binarySearch(),而不是charCharacter,內部當Arrays#binarySearch()調用Character.compareTo(T o) 這裏,指定對象的類型(即。 letter#String)阻止它與Character對象進行比較。然後ClassCastException被投擲。

解決方案:

int index = Arrays.binarySearch(anArray, Character.toUpperCase(letter.charAt(0))); 
+0

我的目標是預先定義的字符數組的隨機擾亂。 Arrays.sort()如何影響這個? – user25976

+0

@ user25976對不起,我沒有注意到你的問題。如果你打算進行隨機爭奪,那麼在這種情況下不要使用Arrays.sort()。我會更新答案。 – Rembo